我和加解密、数字签名的故事

概述

加密有2种:

  1. 单向加密,又称为不可逆加密。
  2. 双向加密,双向加密又分为对称加密和非对称加密。

单向加密对数据加密后,无法从密文解密得到明文。常用的单向加密算法有安全散列算法(Secure Hash Algorithm,简称SHA)、消息摘要算法(Message-Digest Algorithm,简称MD5)。

双向加密对数据加密后,可以从密文解密得到明文。常用的对称加密算法有DES、AES,非对称加密有RSA。


单向加密

单向加密算法的特点是,加密后的密文不能解密得到原文。加密后的密文也称散列(Hash)摘要(Digest)指纹(Thumbprint)
比如MD5,可以将任意长度的内容,加密为128位的密文。不同的内容,加密后会得到不同的密文。即使内容很长,只改变其中的一位,得到的密文也不一样。

比如:
MD5(abcdefghi):8aa99b1f439ff71293e95357bac6fd94
MD5(bbcdefghi):42b99e05df6fc689bb1974ac8cc1caec

因为单向加密密文不能解密得到明文,所以在存储敏感信息时大量使用。比如数据库中,存储的是密码单向加密后的密文,这样就无法解密得到明文密码,很大程度上保护了用户的隐私。即使数据库被攻击,密码泄密,得到的也是密文,无法还原为明文。


密钥和算法

双向加密中,总是会提到密钥(secret key),那什么是密钥呢?

密钥是一种参数,在明文转换为密文的过程中需要输入的参数。
明文转换为密文,需要依照一定的规则,这个规则,称之为算法(Algrothim)。

举个加密的例子:
明文:Hello_world;
规则:每个字符的ASCII减去一个参数;
参数:10;
密文:>[bbeUmehbZ。
如下图所示:
在这里插入图片描述
在这个例子中,规则 “每个字符的ASCII减去一个参数” 就是算法,参数10就是密钥。

解密则是加密的逆过程:
密文:>[bbeUmehbZ;
规则:每个字符的ASCII加上一个参数;
参数:10;
明文:Hello_world。

在例子中,加密和解密的参数(密钥)是一样的,这就是对称加密。

当然,广泛应用的加密规则(算法)比较复杂,参数(密钥)也不会这么简单。

在非对称加密中,加密的参数(密钥)和解密的参数(密钥)是不一样的。为了区分这2个密钥,一个称为公钥(public key),一个称为私钥(private key)。


对称加密算法

对称加密过程:

(1)甲方用密钥对信息进行加密;

(2)乙方同样的密钥对信息进行解密。
由于加密和解密使用同样密钥,这被称为"对称加密算法"(Symmetric-key algorithm)。
对称加密算法有一个最大弱点:甲方必须把密钥告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。

非对称加密算法

1976年,两位美国计算机学家Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman密钥交换算法"。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。

这种新的加密模式被称为"非对称加密算法"。

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后用它对信息加密。

(3)乙方得到加密后的信息,用私钥解密。

如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。

最具影响力,应用最广泛非对称加密算法是RSA算法。


RSA的疑惑

非对称算法有一个很重要的应用,数字签名。
加密和数字签名有什么区别?
公钥和私钥到底是怎么加密、解密的?

RSA算法包含了公钥和私钥,公钥和私钥是相互对应的,即用公钥加密的数据,可以用私钥解密出来;用私钥加密的数据,可以用公钥解密出来。

但一般来说,公钥是公开的,任何人都能获得,私钥是保密的。所以,RSA的用法就出现了2种情况:

(1)其他人用公钥加密数据,那么只有拥有私钥的人能解密。这就是一般所说的加密数据。

(2)甲方用私钥加密数据,那么所有拥有公钥的人都能解密,多用于数字签名。

数字签名例子

前面说了什么是数字签名,可能还是过于抽象,难于理解,现在来举个例子。

注意:数字签名是一个名词,而不是一个动词。所以数字签名只是一个签名,和用笔签下的名是一样的。

比如要发送一篇文章A。

怎么进行数字签名和验证呢?

  1. 用单向加密算法(比如MD5),给文章A生成摘要digestA。
  2. 用私钥对摘要digestA进行加密,得到加密后的摘要EncryptDigestA,EncryptDigestA就是数字签名。
  3. 把文章A(未加密)和EncryptDigestA一起发送出去。
  4. 接收方收到文章A(未加密)和EncryptDigestA。
  5. 用文章A同样执行摘要算法,得到摘要digestB。
  6. 用公钥解密EncryptDigestA,得到digestA。
  7. 比较digestA和digestB,如果相同,则文章A未被篡改;否则文章A被篡改。

为什么需要添加摘要呢?
生成的摘要有这样的特点:不同的内容,生成的摘要都是不一样的。
因为非对称加密的效率比较底,如果对很长的文章内容进行加密,需要花费很多时间。而对生成的摘要加密,则可以明显的提高效率。

如果对公钥和私钥还不清楚的同学,可以去看看知乎的问题RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

关于数字证书和CA,推荐一篇很好的文章数字证书及CA的扫盲介绍


总结

单向加密:不可从密文推出明文,使用场景有存储敏感信息、生产摘要等;
对称加密:加密效率高,但密钥不易于保存;
非对称加密:公钥、私钥不同,所以密钥保密性更好,但效率低。

每种加密都有自己的特点,都有自己的适用场景,比如一次HTTPS请求中,就同时使用了3种加密方式。

最后,附上整理好的RSA加解密代码下载


参考资料

RSA算法原理(一)
数字签名是什么?
RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
数字证书及CA的扫盲介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值