使用 openssl 加密


原文链接: 使用 openssl 加密

结论

文本加密: 新选择 AES-256-GCM 但可能会有兼容性问题, 老系统选AES-256-CBC
流加密: chacha
Chapter 7 OpenSSL
OpenSSL 生成根证书 CA 及签发子证书

那些证书相关的玩意儿 (SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12 等)

数字证书及 CA 的扫盲介绍 @ 编程随想的博客
数字签名与数字证书 - oscar999 的专栏 - 博客频道 - CSDN.NET
数字签名原理简介(附数字证书) - kingsleylam - 博客园

漫谈网络通讯加密(1)加密学概览 – Wyman的原创技术博客 – 恭喜你发现我的小站,撩我请加QQ:234707482、Wechat:_Wyman
How to choose an AES encryption mode (CBC ECB CTR OCB CFB)? - Stack Overflow

分组密码模式,加密但不是消息完整性

ECB :一种块密码,该模式通过分别对每个n比特片段进行加密来加密n比特的倍数的消息。 安全属性很弱 ,这种方法会在块的位置和时间上泄漏块的相等性。 具有相当的传统价值,并且作为其他计划的构建基石的价值,但是这种模式本身并没有达到任何通常理想的安全目标,必须谨慎使用; 欧洲央行不应被视为“通用”保密模式 。
CBC :基于IV的加密方案,该模式作为概率加密方案是安全的,假定随机IV实现与随机比特的不可区分性。 如果IV仅仅是一个随机数 ,并且如果它是在该计划使用的相同密钥下加密的随机数 ,则不能实现保密性 ,正如该标准错误地暗示的那样。 密文极具可塑性。 没有选择的密文攻击(CCA)安全性。 在许多填充方法的正确填充oracle的情况下,保密性会被放弃。 从本质上讲,加密效率低下。 广泛使用,该模式的隐私安全属性会导致频繁的滥用。 可以用作CBC-MAC算法的构建块。 我可以确定CTR模式没有什么重要的优势。
CFB :基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV实现与随机比特的不可区分性。 如果IV是可预测的 ,则不能实现保密,也不能通过该计划使用的相同密钥加密而产生随机数,正如标准错误地暗示的那样。 密文是可延展的。 没有CCA安全性。 从本质上讲,加密效率低下。 方案取决于参数s,1≤s≤n,通常s = 1或s = 8。对于需要一个块密码调用来处理只有s位而言,效率低下。 该模式实现了一个有趣的“自我同步”属性; 在密文中插入或删除任何数量的s位字符只会暂时破坏正确的解密。
OFB :基于IV的加密方案,该模式作为概率加密方案是安全的,假设随机IV实现与随机比特的不可区分性。 如果IV是一个随机数,则不能实现保密性,尽管固定的IV(如计数器)序列确实可以正常工作。 密文极具可塑性。 没有CCA安全性。 加密和解密从本质上讲是串行的,效率低下。 本地加密任意位长度的字符串(不需要填充)。 我可以确定CTR模式没有什么重要的优势。
CTR :基于IV的加密方案,该模式假设随机数IV与随机比特实现不可区分性。 作为一个安全的基于nonce的方案,该模式也可以用作随机IV的概率加密方案。 如果一个随机数重用于加密或解密,则完全失去隐私。 模式的可并行性通常使其在某些设置中比其他机密模式更快,速度更快。 认证加密方案的重要组成部分。 总体而言,通常是实现仅隐私加密的最佳和最现代的方式。
XTS :基于IV的加密方案,该模式通过向每个n位块应用可调节的块密码(作为强PRP安全)而工作。 对于长度不能被n整除的消息,最后两个块将被专门处理。 唯一允许使用的模式是用于加密块结构存储设备上的数据。 底层PRP的窄宽度和部分最终块的差处理是问题。 比(宽块)PRP安全块密码更高效但不太理想。

MAC(消息完整性但不加密)

ALG1-6 :一组MAC,全部基于CBC-MAC。 太多的方案。 有些可证实是VIL PRF,一些是FIL PRF,有些没有可证明的安全性。 一些计划承认破坏性攻击。 一些模式是过时的。 密钥分离对于拥有它的模式来说是不够的。 不应该集体采用,但有选择地选择“最佳”方案是可能的。 也可以采用这些模式中的任何一种,以支持CMAC。 一些ISO 9797-1 MAC被广泛标准化和使用,特别是在银行业务中。 标准(ISO / IEC FDIS 9797-1:2010)的修订版即将发布[93]。
CMAC :基于CBC-MAC的MAC,该模式作为(VIL)PRF(假设底层块密码是良好的PRP)可证明是安全的(达到生日限制)。 基于CBCMAC的方案基本上最小的开销。 在某些应用领域中固有串行性问题,并且与64位块密码一起使用将需要偶尔重新密钥。 比ISO 9797-1收集的MAC更清洁。
HMAC :基于密码散列函数而不是密码算法的MAC(尽管大多数密码散列函数本身都是基于块密码的)。 机制享有强大的可证明的安全界限,尽管不是偏好的假设。 文献中多个密切相关的变体复杂化了解已知的内容。 从来没有人提出过破坏性的攻击。 广泛标准化和使用。
GMAC :基于nonce的MAC,是GCM的特例。 继承了GCM的许多优点和不足之处。 但是对于MAC而言,不必要的要求是不必要的,在这里它几乎没有什么好处。 如果标签被截断为≤64位并且解密的范围未被监控和缩减,则会受到实际攻击。 完全失败重用。 无论如何,如果采用GCM,使用是隐含的。 不建议用于单独的标准化。

认证加密(加密和消息完整性)

CCM :结合CTR模式加密和原始CBC-MAC的基于nonce的AEAD方案。 本质上是连续的,在某些情况下限制速度。 证明安全,具有良好的界限,假设底层blockcipher是一个很好的PRP。 毫不吝啬的建筑,明显的工作。 比GCM更容易实施。 可以用作基于nonce的MAC。 广泛标准化和使用。
GCM :基于nonce的AEAD方案,结合了CTR模式加密和GF(2128)的通用散列函数。 对于某些实施环境而言,效率特性良 假设最小标签截断的结果很好,可证实安全。 在大量标签截断的情况下发生攻击和可证明的安全边界。 可以用作基于随机数的MAC,然后称为GMAC。 有问题的选择允许non-96比特。 建议将随机数限制为96位,并将标记限制在至少96位。 广泛标准化和使用。

比较模式

仅加密:

需要填充的模式 :就像在这个例子中一样,填充通常可能是危险的,因为它会打开填充oracle攻击的可能性。 最简单的防御措施是在解密之前验证每条消息。 见下文。
ECB独立加密每个数据块,同一个明文块将产生相同的密文块。 在ECB维基百科页面上查看ECB加密的Tux图像,了解这是一个严重问题。 我不知道欧洲央行可以接受的任何用例。
CBC具有IV,因此每次消息被加密时需要随机性,改变消息的一部分需要在改变之后重新加密所有东西,在一个密文块中的传输错误完全破坏明文并且改变下一个块的解密,解密可以并行/加密不能,明文在一定程度上是可延展的 - 这可能是一个问题 。

流密码模式 :

这些模式会生成一个伪随机数据流,这可能取决于明文,也可能不取决于明文。 与通常的流密码类似,生成的伪随机流与明文异或以生成密文。 因为您可以随意使用任意数量的随机数据流,所以根本不需要填充。 这种简单性的缺点是加密是完全malleable ,这意味着解密可以由攻击者以他喜欢的任何方式改变,如明文p1,密文c1和伪随机流r,并且攻击者可以选择差异d密文c 2 = c 1 d的解密为p 2 = p 1 d,因为p 2 =c2⊕r=(c1⊕d)⊕r=d⊕(c1⊕r)。 对于两个密文c1 =p1⊕r和c2 =p2⊕r,同样的伪随机流也不能使用两次,攻击者可以计算两个明文的异或为c1⊕c2=p1⊕r⊕p2⊕r= p1⊕p2。 这也意味着,如果原始消息可能已经被攻击者获得,则更改消息需要完全重新加密。 以下所有蒸汽密码模式只需要分组密码的加密操作,因此根据密码,这可能会在极其狭窄的环境中节省一些(硅或机器代码)空间。
CTR很简单,它创建了一个独立于明文的伪随机流,通过从不同的nonces / IVs中计数出不同的伪随机流,这些nonces / IVs乘以最大消息长度,以防止重迭,使用nonces消息加密可能没有每个消息的随机性,解密和加密完成可并行化,传输错误只影响错误的位,仅此而已
OFB还创建独立于明文的伪随机流,对于每个消息,通过以不同的随机数或随机IV开始,获得不同的伪随机流,加密和解密都不是可并行化的,因为CTR使用随机消息加密可能没有每个消息随机性,与CTR传输错误一样,只影响错误的比特等等
CFB的伪随机数据流取决于明文,每个消息需要不同的随机数或随机数IV,例如CTR和OFB使用随机数消息加密可能没有每个消息的随机性,解密是可并行/加密不是,传输错误完全销毁下面的块,但只影响当前块中的错误位
磁盘加密模式 :这些模式专用于在文件系统抽像下加密数据。 出于效率原因,更改光盘上的某些数据只需要重写最多一个光盘块(512字节或4kib)。 他们超出了这个答案的范围,因为他们的使用场景比另一个有很大的不同。 除块级光盘加密外,不要使用它们 。 有些成员:XEX,XTS,LRW。

认证加密:

为了防止填充oracle攻击和对密文的改变,可以计算密文上的消息认证码 (MAC),只有在未被篡改的情况下才解密。 这称为encrypt-then-mac, 应该优于其他任何顺序 。 除极少数用例外,真实性与机密性(后者是加密的目的)一样重要。 经过认证的加密方案(包含关联数据(AEAD))将加密和认证的两部分过程组合为一个分组密码模式,该模式在过程中也会生成认证标签。 在大多数情况下,这会提高速度。

CCM是CTR模式和CBC-MAC的简单组合。 每块使用两个分组密码加密非常缓慢。
OCB速度更快,但受到专利权的阻碍。 尽管免费(如在自由)或非军事软件,专利持有人已授予免费许可 。
GCM是一种速度非常快但可以说是CTR模式和GHASH的复杂组合,它是具有2 ^ 128个元素的伽罗瓦域上的MAC。 它在TLS1.2等重要网络标准中的广泛应用反映在英特尔为加速GHASH计算而推出的特殊指令中 。
建议:
考虑到身份验证的重要性,对于大多数使用情况(除了磁盘加密目的),我会推荐以下两种块密码模式:如果数据通过非对称签名使用CBC进行验证,否则使用GCM。

本文主要介绍一些加密库中加密算法的使用原则和需要注意的问题。
首要原则:如果工程中涉及任何安全加密相关的内容,绝对绝对不要尝试自己实现加密算法。

对称加密相关

当你不知道选什么加密算法时,用AES,配合不同的工作模式,它既可以用于分组加密,也可以用于流加密,保证安全性的同时在大多数平台上都有不俗的性能表现。

128位的AES已经足够安全,256位的AES现阶段并非必要,除非你想用它来抵御未来量子计算机的穷举攻击。
AES不仅比DES(包括3DES)安全,还比DES快,除非已经有专用的DES加速硬件,否则没有选择DES的理由。
流加密算法用ChaCha20(或Salsa20),不要考虑RC4,早已被破解,而且ChaCha20不仅更安全,也快得多。

在有AES-NI指令集的平台上,使用AES速度会比较快,在没有该指令集的平台上,使用ChaCha20更快,而多数PC端CPU都有该指令集,多数移动端CPU没有该指令集(或者有类似指令集,但是效果也没有AES-NI好),因此有PC端用AES,移动端用ChaCha20的做法。

AES分组密码工作模式有ECB、CBC、CTR、CFB、OFB等,其中CTR、CFB、OFB支持流密码。
ECB模式下同样的明文产生同样的密文,不安全,除非每一个加密块都换一次密码,不然不要选择这个模式。
CBC的IV(初始化向量)必须是不可预测的随机数。

CTR模式下,nonce只要求不可重复,一个常用的实践是,将一个不重复的64位的随机数跟一个64位的计数器拼接在一起,形成128位的nonce。
CBC模式加密不能并行,解密可以并行。CTR模式各个密文块相互独立,加密解密都可以并行化。

只有AEAD算法(认证加密)才可以防篡改,比如AES-GCM、AES-OCB、ChaCha20-Poly1305等。打开一个HTTPS网站,它使用的加密方法多半是AES-GCM。部分网站在移动端上可能会采用的ChaCha20-Poly1305,它针对ARM架构的CPU进行了优化。

磁盘加密请用XTS-AES。

散列相关

MD5、SHA-1已经相继被发现可以被恶意碰撞,比如谷歌造出来了两个内容不同但是SHA-1值相同的PDF文件,不要在工程中使用这两种散列算法,至少要使用SHA-256。

如果需要使用用户输入密码来加密信息,不要直接使用密码或者简单地做一下散列运算作为密钥,应该用专门的PBKDF2算法来导出密钥。

保存密码时,一个很常见的误区是对密码进行多次的MD5或者SHA-1计算,以为这样更加安全,实际上这种做法的安全性并未得到验证,反而可能会因为减小了摘要空间而降低安全性。

为了抵御彩虹表攻击,保存密码一定要加盐(salt),而且对每一个密码使用不同的salt。很多平台都会提供这样的API,这些API通常会把salt跟散列值作为整体输出,不需要修改数据库来另外保存salt。

需要注意的是,MD/SHA系列(比如MD5、SHA-256等等)本身并不是设计来保存密码的,所以即使SHA-256仍是安全的,裸的随机salt+SHA-256也不是好的选择。

保存密码推荐使用Bcrypt,它就是为密码储存专门设计的,在C, C#, Go, Java, JavaScript, Perl, PHP, Python, Ruby等众多语言中都有相应的实现。当然,更新的Scrypt和Argon2理论上安全性会更高,但是它们支持不够广泛,在很多平台上并不可用。

比对用户输入的密码跟数据库中保存的密码不能用语言中的==比较操作符或者strcmp函数,可能会被时序攻击,请使用固定运行时间的比较方法,例如PHP中提供的password_verify()函数。

非对称加密相关

非对称加密非常非常非常慢,比对称加密慢几个数量级。

所以一般使用非对称加密算法加密对称密钥,然后使用对称密钥加密消息内容。

通过Diffie–Hellman密钥交换得到密钥不能直接用,其分布并不均匀,为了安全,需要使用专门的密钥导出函数(Key Derivation Function)导出密钥。

椭圆曲线加密密钥比RSA短得多,要达到128位AES的加密强度,椭圆曲线密钥只需要256位,而RSA需要3072位。

但是椭圆曲线加密实现更复杂更容易出错。

RSA中,公共指数e一般选择65537。

RSA公钥长度至少选择2048位,1024位已经不再安全。

椭圆曲线加密时曲线建议选取Curve25519(包括用于密钥交换的X25519和用于数字签名的Ed25519),效率与安全性俱佳。如果Curve25519不可用(比如低版本的OpenSSL),建议选择prime256v1(又称P-256),支持广泛。

常用加密库比较

仅比较本人使用过的加密库,可能带有一定的主观倾向,仅供参考。

OpenSSL
使用C语言编写,是最老牌、使用最广泛的加密库之一,被集成于大多数Linux发行版中,大量网站依赖其提供HTTPS服务。

优点:使用极为广泛,效率和安全性久经考验,即使出现漏洞也可以很快被发现并修补,在不知道用什么的情况下是最稳妥的选择。

缺点:官方文档不够完善,很多API需要查阅相关书籍和博文才知道怎么用。内部代码比较乱。

建议:使用OpenSSL进行编程时,尽量使用更高级的EVP系列API(就是那堆以EVP_开头的函数),这是OpenSSL官方推荐的做法。

Botan
使用C++11编写的加密库。虽然目前使用C++11编写,但实际上其诞生于九十年代,也是比较老牌的加密库。

优点:包含的算法齐全,C++ API用起来很方便,其内部代码不像OpenSSL那样杂乱无章。提供FFI模块,可以用于多种语言,包括C和Python等。

缺点:管道/过滤器机制性能偏低,且未来不太可能改善。文档部分常用API没有示例,使用不便。

建议:C++项目建议使用此库。

libsodium
使用C语言编写,其目的是为其它高级的加密工具提供支持,因此跟上面提到的两个加密库有很大的不同。

优点:安全性和性能上相对于其它加密库更为激进。新版本只包含目前最安全的加密算法,比如密钥导出函数默认即是Argon2,AES只支持硬件加速的AES-256-GCM,诸如MD5、SHA1、RC4这些不安全的算法一概不提供。因此只使用其默认提供的算法即可达到很高的安全性,不容易因为误用算法导致安全漏洞或性能缺陷。

缺点:它的优点同时也是它的缺点,比较激进,可供选择的算法比较少,灵活性不如上面提到的加密库。

生成随机数

openssl rand -base64 128

字符串加解密

echo "message" | openssl enc -aes-256-cbc -a -pass pass:$password
echo "encmessage" | openssl enc -aes-256-cbc -a -d -pass pass:$password

初始向量(IV)第一个密文分组使用的明文

CBC模式是用于一般数据加密的一个普通的分组密码算法。在这个模式中,第一个密文分组的计算需要一个特殊的明文,习惯上称之为初始向量(IV)。IV是一个随机的分组,每次会话加密时都要使用一个新的随机IV,IV无须保密,但一定是不可预知的。由于IV的随机性,IV将使得后续的密文分组都因为IV而随机化。由于IV需要公开,且第一个分组的加密结果是IV,因此CBC模式对于m个分组的明文将输出m+1个分组的密文

salt

OpenSSL AES 算法中 Key 和 IV 是如何生成的? - 简书
OpenSSL AES 算法使用的 Key 和 IV 生成规律:将 hash 结果(第一次 hash 运算时为空)、passphrase 和 salt(nosalt 时为空)拼接后循环做 hash 运算,再根据 AES 所需的 Key 和 IV 的 bit 数取值。

salt是一段随机字节,在每次加密时都重新生成,并存储在文件头中;
在解密时,从头部检索salt,并根据提供的密码与salt值重新计算Key和IV

  1. 默认-e 加密时,每次都生成新的salt
  2. 您可以使用-S "73616c7431323334" 标志指定salt值 相同的密码始终产生相同的密钥和IV
  3. 或者完全取消激活salt -nosalt 这样的话同一个密码每次都会生成相同的 Key和IV

    openssl 文件头结构

    magic value (8 bytes): the bytes 53 61 6c 74 65 64 5f 5f Salted__
    salt value (8 bytes)
    因此,一个固定的16字节头,从字符串" Salted__"的ASCII编码开始,然后是盐本身。就这样 !没有加密算法的指示; 你应该自己跟踪。

验证 KEY
echo -n salt1234 | od -A n -t x1 | perl -lpe's,\s+,,g'
73616c7431323334

openssl enc -e -aes-128-cbc -pass pass:123 -S 73616c7431323334 -P -md sha256
salt=73616C7431323334
key=5A7C52236BAEAE1A92A6B2D1E50C43ED
iv =9F629A34588A4006FE1C7E8FC664B5EC

echo -n 123salt1234 | openssl dgst -sha256 -binary | hexdump -Cv
00000000 5a 7c 52 23 6b ae ae 1a 92 a6 b2 d1 e5 0c 43 ed |Z|R#k.........C.|
00000010 9f 62 9a 34 58 8a 40 06 fe 1c 7e 8f c6 64 b5 ec |.b.4X.@...~..d..|
00000020
仔细观察,-P输出与hexdump输出匹配。

结论:enc除了学习和探索之外,不要使用它,它只是一个不错的玩具(如果你不知道的话)

文件加密AES

encryption - openssl: recover key and IV by passphrase - Information Security Stack Exchange

-binary
-nopad -nosalt
bad decrypt
windows加密Linux解密错误处理: envelope routines:EVP_EncryptFinal_ex:data not multiple of block length:evp_enc.c:414 只在Linux解密时 增加 -nopad 参数

openssl aes-256-cbc -e -md md5 -pass "pass:Hr2019" -in a.txt -out a.txt.gpg # 密码加密
openssl aes-256-cbc -d -md md5 -pass "pass:Hr2019" -in a.txt.gpg -out aa.txt # 密码解密

openssl enc -e -aes-256-cbc -pass pass:'123456' -in a.txt -out a.txt.gpg # 密码加密 openssl enc -d -aes-256-cbc -pass pass:'123456' -in a.txt.gpg -out aa.txt # 密码解密

openssl aes-256-cbc -md md5 -k 'lzkp' -in a.txt -out a.txt.gpg
openssl aes-256-cbc -md md5 -e -k '123456' -in a.txt -out a.txt.gpg
openssl aes-256-cbc -md md5 -nopad -d -k '123456' -in a.txt.gpg -out aa.txt

加密参数:
-salt 是否加盐,加密 -e 时使用
-k "123456" =不等价= -pass pass:'123456'
-kfile "pass.pem" =等价= -pass file:'./pass.pem'
-md md5|SHA256 指定hash算法 use to create a key from a passphrase.
-a -base64 对输出文件进行 base64 编码输出
-P option (uppercase P) to print out the salt, key and IV, and then exit.
-p (lowercase P) to print out the salt, key and IV, and then proceed with the encryption

CBC模式下的Blowfish

要加密:

$ openssl bf < arquivo.txt > arquivo.txt.bf
要解密:

$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === CBC模式下的Blowfish

cipher suites

密码套件(Cipher suite)是传输层安全(TLS)/安全套接字层(SSL)网络协议中的一个概念。
在TLS 1.3之前,密码套件的名称是以协商安全设置时使用的身份验证、加密、消息认证码(MAC)和密钥交换算法组成。TLS 1.3中的密码套件格式已经修改。在目前的TLS 1.3草案文档中,密码套件仅用于协商加密和HMAC算法。[1]

每个cipher suite(例如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)定义一个密钥交换算法、一个批量加密算法、一个消息认证码(MAC)算法,以及一个伪随机函数(PRF)。

密钥交换算法,例如ECDHE_RSA,用于决定客户端与服务器之间在握手时如何身份验证。[8]
批量加密算法,例如AES_128_GCM,用于加密消息流。它还包括密钥大小及显式和隐式初始化向量(密码学随机数)的长度。[9]
消息认证码算法,例如SHA256,用于创建消息摘要,消息流每个数据块的加密散列。[9]
伪随机函数,例如TLS 1.2的伪随机函数使用MAC算法的散列函数来创建一个主密钥——连接双方共享的一个48字节的私钥。主密钥在创建会话密钥(例如创建MAC)时作为一个熵来源。[10]

算法示例

  1. 密钥交换/协商
    RSA、Diffie–Hellman、ECDH、SRP、PSK
  2. 身份验证
    RSA、DSA、ECDSA
  3. 块密码
    RC4、3DES、AES、IDEA、DES、Camellia。在旧版本的SSL中,RC2也被使用过。
  4. 消息身份验证
    对于TLS来说,密钥散列消息认证码使用MD5或一种SHA散列算法。对于SSL,则SHA、MD5、MD4及MD2都可使用。

  • 对称加密
    AES(128) | DES(64) | Blowfish(64) | CAST(64) | IDEA(64) | RC2(64) | RC5(64)
  • 非对称加密
    DH | RSA | DSA | EC
  • 信息摘要 hash
    MD2 | MD5 | MDC2 | SHA | RIPEMD | DSS

7.1.7. passwd

MD5-based password algorithm
openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'
$1$random-p$AOw9RDIWQm6tfUo9Ediu/0

-crypt standard Unix password algorithm (default)
openssl passwd -crypt -salt 'sa' 'password'
sa3tHJ3/KuYvI


7.1.8. digest

如何创建一个文件的 MD5 或 SHA1 摘要?

摘要创建使用 dgst 选项.
7.1.8.1. list-message-digest-commands

列出可用摘要

$ openssl list-message-digest-commands
md2
md4
md5
mdc2
rmd160
sha
sha1

7.1.8.2. md5

MD5 digest

openssl dgst -md5 filename
$ openssl dgst -md5 message.txt
MD5(message.txt)= d9226d4bd8779baa69db272f89a2e05c

7.1.8.3. sha1

SHA1 digest

openssl dgst -sha1 filename
$ openssl dgst -sha1 /etc/passwd
SHA1(/etc/passwd)= 9d883a9d35fd9a6dc81e6a1717a8e2ecfc49cdd8


7.1.9. enc

使用方法:

$ openssl enc 加密算法 -k 密码 -in 输入明文文件 -out 输出密文文件
$ openssl enc 加密算法 -k 密码 -in 输出密文文件 -out 输入明文文件
7.1.9.1. list-cipher-commands

可用的编码 / 解码方案

or get a long list, one cipher per line

openssl list-cipher-commands

openssl list-cipher-commands

aes-128-cbc
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc
aes-256-ecb
base64
bf
bf-cbc
bf-cfb
bf-ecb
bf-ofb
cast
cast-cbc
cast5-cbc
cast5-cfb
cast5-ecb
cast5-ofb
des
des-cbc
des-cfb
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-ofb
des-ofb
des3
desx
idea
idea-cbc
idea-cfb
idea-ecb
idea-ofb
rc2
rc2-40-cbc
rc2-64-cbc
rc2-cbc
rc2-cfb
rc2-ecb
rc2-ofb
rc4
rc4-40
rc5
rc5-cbc
rc5-cfb
rc5-ecb
rc5-ofb

7.1.9.2. base64

使用 base64-encode 编码 / 解码

使用 enc -base64 选项

通过管道操作
echo "encode me" | openssl enc -base64
ImVuY29kZSBtZSIgDQo=
echo -n "encode me" | openssl enc -base64
LW4gImVuY29kZSBtZSIgDQo=

编码
openssl enc -base64 -in file.txt
openssl enc -base64 -in file.txt -out file.txt.enc

使用 -d (解码) 选项来反转操作

openssl enc -base64 -d -in file.txt.enc
Hello World!
openssl enc -base64 -d -in file.txt.enc -out file.txt
echo SGVsbG8gV29ybGQhDQo= | openssl enc -base64 -d
Hello World!

7.1.9.3. des

对称加密与解密

加密

openssl enc -des -e -a -in file.txt -out file.txt.des

解密

openssl enc -des -d -a -in file.txt.des -out file.txt.tmp

7.1.9.4. aes

加密
openssl enc -aes-128-cbc -in filename -out filename.out
解密
openssl enc -d -aes-128-cbc -in filename.out -out filename

7.1.10. rsa

产生密钥对:

生成私钥
openssl genrsa -out private.key 1024
根据私钥产生公钥
openssl rsa -in private.key -pubout > public.key

用公钥加密明文
$ openssl rsautl -encrypt -pubin -inkey public.key -in filename -out filename.out
用私钥解密
$ openssl rsautl -decrypt -inkey private.key -in filename.out -out filename

7.1.11. dsa

Example 7.1. dsaparam & gendsa

create parameters in dsaparam.pem

openssl dsaparam -out dsaparam.pem 1024

create first key

openssl gendsa -out key1.pem dsaparam.pem

and second ...

openssl gendsa -out key2.pem dsaparam.pem

生成私钥
openssl dsaparam -out dsaparam.pem 1024
openssl gendsa -out private.key dsaparam.pem
根据私钥产生公钥
openssl dsa -in private.key -pubout -out public.key

$ ls
dsaparam.pem private.key public.key

7.1.12. rc4

rc4 文件加密解密

openssl enc -e -rc4 -in in.txt -out out.txt #加密
openssl enc -d -rc4 -in out.txt -out test.txt #解密
使用 -k 指定密钥
openssl enc -e -rc4 -k passwd -in in.txt -out out.txt
openssl enc -d -rc4 -k passwd -in out.txt -out test.txt

`