Blaze 2018-12-15
[b][/b]
支持的算法包括:MD2, ;MD4, ;MD5, ;MDC2, ;SHA1(有时候叫做DSS1), ;RIPEMD-160。SHA1和RIPEMD-160产生160位哈西值,其他的产生128位。除非出于兼容性考虑,否则推荐使用SHA1或者RIPEMD-160。
除了RIPEMD-160需要用rmd160命令外,其他的算法都可用dgst命令来执行。
OpenSSL对于SHA1的处理有点奇怪,有时候必须把它称作DSS1来引用。
消息摘要算法除了可计算哈西值,还可用于签名和验证签名。签名的时候,对于DSA生成的私匙必须要和DSS1(即SHA1)搭配。而对于RSA生成的私匙,任何消息摘要算法都可使用。
# ;消息摘要算法应用例子
# ;用SHA1算法计算文件file.txt的哈西值,输出到stdout
$ ;openssl ;dgst ;-sha1 ;file.txt
# ;用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt
$ ;openssl ;sha1 ;-out ;digest.txt ;file.txt
# ;用DSS1(SHA1)算法为文件file.txt签名,输出到文件dsasign.bin
# ;签名的private ;key必须为DSA算法产生的,保存在文件dsakey.pem中
$ ;openssl ;dgst ;-dss1 ;-sign ;dsakey.pem ;-out ;dsasign.bin ;file.txt
# ;用dss1算法验证file.txt的数字签名dsasign.bin,
# ;验证的private ;key为DSA算法产生的文件dsakey.pem
$ ;openssl ;dgst ;-dss1 ;-prverify ;dsakey.pem ;-signature ;dsasign.bin ;file.txt
# ;用sha1算法为文件file.txt签名,输出到文件rsasign.bin
# ;签名的private ;key为RSA算法产生的文件rsaprivate.pem
$ ;openssl ;sha1 ;-sign ;rsaprivate.pem ;-out ;rsasign.bin ;file.txt
# ;用sha1算法验证file.txt的数字签名rsasign.bin,
# ;验证的public ;key为RSA算法生成的rsapublic.pem
$ ;openssl ;sha1 ;-verify ;rsapublic.pem ;-signature ;rsasign.bin ;file.txt
[b][/b]
OpenSSL支持的对称密码包括Blowfish, ;CAST5, ;DES, ;3DES(Triple ;DES), ;IDEA, ;RC2, ;RC4以及RC5。
OpenSSL ;0.9.7还新增了AES的支持。很多对称密码支持不同的模式,包括CBC, ;CFB, ;ECB以及OFB。对于每一种密码,默认的模式总是CBC。需要特别指出的是,尽量避免使用ECB模式,要想安全地使用它难以置信地困难。
enc ;命令用来访问对称密码,此外还可以用密码的名字作为命令来访问。除了加解密,base64可作为命令或者enc命令选项对数据进行base64编码/解码。
当你指定口令后,命令行工具会把口令和一个8字节的salt(随机生成的)进行组合,然后计算MD5 ;hash值。这个hash值被切分成两部分:加密钥匙(key)和初始化向量(initialization ;vector)。当然加密钥匙和初始化向量也可以手工指定,但是不推荐那样,因为容易出错。
# ;对称加密应用例子
# ;用DES3算法的CBC模式加密文件plaintext.doc,
# ;加密结果输出到文件ciphertext.bin
$ ;openssl ;enc ;-des3 ;-salt ;-in ;plaintext.doc ;-out ;ciphertext.bin
# ;用DES3算法的OFB模式解密文件ciphertext.bin,
# ;提供的口令为trousers,输出到文件plaintext.doc
# ;注意:因为模式不同,该命令不能对以上的文件进行解密
$ ;openssl ;enc ;-des-ede3-ofb ;-d ;-in ;ciphertext.bin ;-out ;plaintext.doc ;-pass ;pass:trousers
# ;用Blowfish的CFB模式加密plaintext.doc,口令从环境变量PASSWORD中取
# ;输出到文件ciphertext.bin
$ ;openssl ;bf-cfb ;-salt ;-in ;plaintext.doc ;-out ;ciphertext.bin ;-pass ;env:PASSWORD
# ;给文件ciphertext.bin用base64编码,输出到文件base64.txt
$ ;openssl ;base64 ;-in ;ciphertext.bin ;-out ;base64.txt
# ;用RC5算法的CBC模式加密文件plaintext.doc
# ;输出到文件ciphertext.bin,
# ;salt、key和初始化向量(iv)在命令行指定
$ ;openssl ;rc5 ;-in ;plaintext.doc ;-out ;ciphertext.bin ;-S ;C62CB1D49F158ADC ;-iv ;E9EDACA1BD7090C6 ;-K
89D4B1678D604FAA3DBFFD030A314B29
[b][/b]
Diffie-Hellman被用来做钥匙协商(key ;agreement),具有保密(secrecy)功能,但是不具有加密(encryption)或者认证(authentication)功能,因此在进行协商前需用别的方式对另一方进行认证。
首先,Diffie-Hellman ;创建一套双方都认可的参数集,包括一个随机的素数和生成因子(generator ;value,通常是2 ;或者 ;5)。基于这个参数集,双方都计算出一个公钥匙和私钥匙,公钥匙交给对方,对方的公钥匙和自己的私钥匙用来计算共享的钥匙。
OpenSSL ;0.9.5 ;提供了dhparam ;命令用来生成参数集,但是生成公钥匙和私钥匙的命令 ;dh ;和 ;gendh ;已不推荐使用。
未来版本可能会加上这个功能。
# ;Diffie-Hellman应用例子
# ;使用生成因子2和随机的1024-bit的素数产生D0ffie-Hellman参数
# ;输出保存到文件dhparam.pem
$ ;openssl ;dhparam ;-out ;dhparam.pem ;-2 ;1024
# ;从dhparam.pem中读取Diffie-Hell参数,以C代码的形式
# ;输出到stdout
$ ;openssl ;dhparam ;-in ;dhparam.pem ;-noout ;-C
(Digital ;Signature ;Algorithm, ;DSA)
DSA主要用来做认证,不能用来加密(encryption)或者保密(secrecy),因此它通常和 ;Diffie-Hellman ;配合使用。
在进行钥匙协商前先用 ;DSA ;进行认证(authentication)。
有三个命令可用来完成 ;DSA ;算法提供的功能:
dsaparam ;命令生成和检查 ;DSA ;参数,还可生成 ;DSA ;私钥匙。
gendsa ;命令用来为一套 ;DSA ;参数生成私钥匙,这把私钥匙可明文保存,也可指定加密选项加密保存。
可采用 ;DES,3DES,或者 ;IDEA ;进行加密。
dsa ;命令用来从 ;DSA ;的私钥匙中生成公钥匙,还可以为私钥匙加解密,或者改变私钥匙加密的口令。
# ;DSA应用例子
# ;生成1024位DSA参数集,并输出到文件dsaparam.pem
$ ;openssl ;dsaparam ;-out ;dsaparam.pem ;1024
# ;使用参数文件dsaparam.pem生成DSA私钥匙,
# ;采用3DES加密后输出到文件dsaprivatekey.pem
$ ;openssl ;gendsa ;-out ;dsaprivatekey.pem ;-des3 ;dsaparam.pem
# ;使用私钥匙dsaprivatekey.pem生成公钥匙,
# ;输出到dsapublickey.pem
$ ;openssl ;dsa ;-in ;dsaprivatekey.pem ;-pubout ;-out ;dsapublickey.pem
# ;从dsaprivatekey.pem中读取私钥匙,解密并输入新口令进行加密,
# ;然后写回文件dsaprivatekey.pem
$ ;openssl ;dsa ;-in ;dsaprivatekey.pem ;-out ;dsaprivatekey.pem ;-des3 ;-passin
中的RSA算法
RSA ;得名于它的三位创建者:
Ron ;Rivest, ;Adi ;Shamir, ;Leonard ;Adleman。
目前之所以如此流行,是因为它集保密、认证、加密的功能于一体。
不像 ;Diffie-Hellman ;和 ;DSA,RSA ;算法不需要生成参数文件,这在很大程度上简化了操作。