MD5 算法
MD5 消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。MD5 由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于 1992 年公开,用以取代 MD4 算法。
SHA1 算法
SHA1 又被称为安全哈希算法(Secure Hash Algorithm)对于长度小于 2^64 位的消息,SHA1 会产生一个 160 位的消息摘要,比 MD5 多了 32 位,更安全,但其处理速度比 MD5 慢。
使用 openssl dgst、md5sun 和 sha1sum 来计算一个文件的 Hash 值。
MD5
SHA1
DES 全称为 Data Encryption Standard,又称为美国数据加密标准,是一种使用密钥加密的块算法,是 1972 年美国 IBM 公司研制的对称密码体制加密算法。
DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法,只有掌握了和发送方相同密钥的人才能解读由 DES 加密算法加密的密文数据。
可以使用 man enc 查看此命令的帮助信息。(前面提到的 man openssl 也可以查看帮助手册,但是里面有太多我们暂时不需要的信息,使用 man enc 可以只查看 openssl enc 这个子命令的帮助信息)
其中的内容非常多,我们选择其中几个选项给大家讲解一下。
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-e:加密,这是一个默认选项,可以不指定;
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致;
-ciphername:指定加密方式。
AES 算法简介
AES 加解密
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。它比 DES 速度更快,更安全,被用来替代 DES。
我们经常会听到 AES128,AES192,AES256 ,其实意思是支持不同长度密钥的 AES 算法。
encode
decode
cbc 代表的是工作模式,在解密时也要用相同的工作模式解密,不然会报错,如下图:
用 openssl enc --help 查看帮助,可以看到如下部分内容:
图片描述
可以看到对于 aes-128 而言,有 cfb、cfb1、ctr、ofb、cbc、ecb 等工作模式。
可以使用下面的命令将每个工作模式都试一试,对比看一下有什么不同。
只列出了五种工作模式,其他的可以类比
openssl enc -aes-128-cfb -in aes.txt -out cfb.bin
openssl enc -aes-128-cfb1 -in aes.txt -out cfb1.bin
openssl enc -aes-128-ctr -in aes.txt -out ctr.bin
openssl enc -aes-128-cbc -in aes.txt -out cbc.bin
openssl enc -aes-128-ecb -in aes.txt -out ecb.bin
copy
用 cat
通过 openssl enc 子命令对测试文件进行 AES 加解密,理解了对称加密特点以及 AES 加密的安全性,AES 比 DES 更加安全,并且支持不同长度的密钥。我们之前说过衡量对称算法优劣的主要尺度是其密钥的长度。
RSA 算法简介
非对称加解密过程
RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
下图表示非对称加解密过程,通过下图试着回忆一下之前所学的内容。
接下来就是使用 openssl 生成一个 2048 位的私钥 private.pem:
openssl genrsa -out private.pem 2048
来查看一下私钥的内容:
根据私钥生成公钥 public.pem :
openssl rsa -in private.pem -pubout -out public.pem
来查看一下公钥的内容:
方式一:公钥加密,私钥解密
用公钥加密
用公钥对 message.txt 加密,输出密文到 enc.txt 文件中:
openssl rsautl -encrypt -in message.txt -pubin -inkey public.pem -out enc.txt
copy
接下来可以使用 cat enc.txt 来看一下加密之后的信息长什么样,结果如下图:
用私钥解密
用私钥对 enc.txt 进行解密,输出到 dec.txt 文件中:
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
copy
接下来可以使用 cat dec.txt 来看一下解密之后的信息长什么样,结果如下图:
用一幅图对这个过程进行总结:
方式二:私钥加密,公钥解密
用私钥签名
用私钥 private.pem 对 message.txt 进行签名,输出到 sign.bin 中:
openssl rsautl -sign -in message.txt -inkey private.pem -out sign.bin
copy
用公钥验证
用公钥 public.pem 对签名 sign.bin 进行验证,输出到 dec.txt 中:
openssl rsautl -verify -in sign.bin -pubin -inkey public.pem -out dec.txt