做金融服务网站赚钱,做的好的手机网站有哪些,iis6 静态网站,wordpress 博客主机原文网址#xff1a;加密和签名的区别及应用场景_IT利刃出鞘的博客-CSDN博客
简介
本文介绍加密和签名的区别及应用场景。
RSA是一种非对称加密算法#xff0c; 可生成一对密钥#xff08;私钥和公钥#xff09;。#xff08;RSA可以同时支持加密和签名#xff09;。 …原文网址加密和签名的区别及应用场景_IT利刃出鞘的博客-CSDN博客
简介
本文介绍加密和签名的区别及应用场景。
RSA是一种非对称加密算法 可生成一对密钥私钥和公钥。RSA可以同时支持加密和签名。
加密和签名的区别
加密
用公钥对明文加密用对应的私钥才能解密防止明文被人看到。
签名
用私钥对明文签名用对应的公钥验签验证签名防止数据被篡改。
加密流程
友情提醒以下场景仅为说明基本的加密流程不符合真实应用)。
自从潘金莲放窗帘打到西门庆的头之后他们就开始秘密交往潘金莲的丈夫武大郎总是怀疑他们俩在偷情苦于没有证据在暗地里观察。
一天潘金莲想写情书撩西门庆但是情书内容不想被武大郎知道于是潘金莲就告诉西门庆采用 RSA 加密的方式来传递书信。
于是西门庆就用 RSA 生成了一对密钥一个公钥一个私钥将公钥的内容写成一封信然后寄出去送给潘金莲。
武大郎观察到了西门庆发出的信件偷偷地将这封信件拦截了下来并复制了一份自己藏着然后又将信件原路寄给潘金莲以免打草惊蛇以为这样就可以神不知鬼不觉地拿到他们之间偷情的证据。武大郎打开信封发现里面写的只是公钥内容。
信封公钥传达到潘金莲手上后潘金莲就开始写情书了“巴拉巴拉各种虎狼之词”明文。写好后装入信封想直接寄回给西门庆但是马上停住了心想这封信如果这样直接寄出去中途被武大郎拦截的话不就什么都被看到了吗于是潘金莲用西门庆发过来的公钥对自己写的情书进行加密生成了一份完全看不懂的信息“eSYJztu3RqGZBcRPvINyg2Hpmu…”密文。然后这封信可以放心的寄给西门庆了。
果然武大郎偷偷观察到了潘金莲发出的信件又进行同样的操作拦截复制原路寄回给西门庆。当武大郎打开复制回来的信件密文后发现又是一堆看不懂的信息然后尝试用之前从西门庆那封信复制下来的公钥进行各种 RSA 操作用公钥加密解密结果发现无论怎么操作得到的都是看不懂的信息。单凭这封全是乱码的信件并不能坐实潘金莲与西门庆偷情。
信封密文最终传达到西门庆手上西门庆拿着自己的密钥密钥只有自己知道其他人都不知道对信封进行解密于是看到了信封原来的内容“巴拉巴拉各种虎狼之词…”西门庆被撩得心花怒放。
结论
以上是使用 RSA 进行加密解密的一个虚拟场景。可见加密后消息的传递是单向的只有潘金莲发加密消息给西门庆西门庆没法直接发有效的加密消息给潘金莲因为潘金莲没有私钥。除非双方都各自生成自己得 RSA 公钥私钥并且互相发送各自的公钥给对方这样双方就可以加密通讯了。
整个通讯流程单向
A 明文告诉 B我现在要发送消息给你请使用 RSA 进行加解密这条消息会被 C 截获C 知道了 AB 之间要通讯并使用 RSA 加密。B 生成一对密钥公钥私钥然后将公钥发送给 A这个公钥会被 C 截获但是 C 拿不到私钥。A 把要发送的消息用公钥进行 RSA 加密得到密文然后发送给 B这个密文被 C 截获但 C 无法知道密文所对应的明文的内容因为 C 只截获到公钥没有私钥用公钥对密文怎么操作都得不到明文。B 拿到密文后使用自己的私钥解密得到明文。
B如果想发加密的消息给A则将以上流程反着来走一遍就行了只不过就需要由A来生成密钥公钥私钥。
也就是说
A想给B发加密消息由B来生成密钥对公钥B私钥B对外公布公钥B。B想给A发加密消息由A来生成密钥对公钥A私钥A对外公布公钥A。
签名流程
西门庆想给潘金莲写信告诉她午时去王婆家做衣服。潘金莲要如何才能确信这条消息真的是西门庆发给她的呢万一这条消息是哪个泼皮乱发的那潘金莲岂不是白跑一趟
RSA 算法有一组对称操作用公钥加密的密文用私钥解密可以得到明文反过来用私钥加密的密文用公钥解密也可以得到明文。
潘金莲手上是有西门庆的公钥的延续上一场景的公钥如果西门庆用私钥对消息进行加密潘金莲用公钥进行解密如果解密后能得到明文那就能说明发送者确实是西门庆本人。因为除了西门庆外没有人拥有私钥能用这个公钥解密的密文一定是密钥的持有者即西门庆所发出的。
于是西门庆写了一条消息“午时去王婆家做衣服”明文然后用私钥将这条消息加密生成了“PvINeSYJuZBcRygztu3Gpm2HRq…”密文一共两条消息一条明文一条密文合并写在一封信里寄给了潘金莲。
潘金莲收到信后用公钥对信件的密文部分“PvINeSYJuZBcRygztu3Gpm2HRq…”进行 RSA 解密得到“午时去王婆家做衣服”。然后和信件前面部分里对比发现内容一模一样这就确认了消息确实是西门庆发的。
说明
西门庆用私钥对前面明文内容加密然后追加到明文后面的这种做法就是签名。
潘金莲用公钥对签名解密并与前面明文部分进行比对这个做法就叫做验签。
为什么可以这么做不怕被武大郎中途截获修改吗不怕。因为如果武大郎中途截获了这封信并修改成“申时去王婆家喝茶”但由于武大郎没有私钥无法对明文加密因此无法修改后面的签名部分。当潘金莲收到信件后用公钥解密签名部分得到的内容跟被篡改的明文内容一对比发现不一致就说明消息被篡改了发送者并不是西门庆。
又或者武大郎用自己的私钥对篡改后的明文进行加密签名再发送给潘金莲潘金莲用手上西门庆的公钥根本无法解密武大郎篡改后的加密部分这种情况也可以确定发送者不是西门庆。
从这里可以看出加密和签名这两种场景是不一样的。
加密是为了确保通讯内容不被第三方知道。签名是为了确保发送者确实是本人并且消息没有被篡改过。
在加密场景下并不关心消息是否被篡改过。可能武大郎第一次截获西门庆公钥时偷偷换成了自己生成的公钥并发给潘金莲。潘金莲用公钥加密后发出的情书被武大郎截获之后武大郎用自己的私钥也是可以解密出来那些虎狼之词的中间人攻击但是加密场景并没有解决这些问题加密仅是为了不让私钥持有者以外的第三方知道消息的内容。
在签名场景下只关心消息没有被篡改并不关心内容是否保密。比如“午时去王婆家做衣服”就是明文传输任何人都知道这个信息。签名场景并不负责保密内容仅仅是为了说明这条消息是西门庆本人发出的并且没有被篡改过。
项目场景
公钥之所以叫公钥意思是可以公开给任何人。任何人拿到一把锁都是没有意义所以对锁的定义就是不能打开钥匙即不能用私钥加密公钥解密切记我说的是加密场景不能用私钥加密公钥解密加签的场景正好相反恰恰是私钥加密公钥解密不过我们通常会说成私钥加签公钥验签。
验签
实际项目中一般使用明文的哈希值来进行验签。
数字签名属于非对称加密非对称加密依赖于复杂的数学运算包括大数乘法、大数模等等如果数据量大那么计算数字签名将会比较耗时。所以先将原数据进行 Hash 运算得到的 Hash 值就叫做摘要然后对摘要计算签名。不同的内容计算出的摘要是不同的。
摘要最好是不可逆转的这样即使第三方使用公钥解签出摘要也无法根据摘要反推出原本的数据。一般使用 MD5 作为 Hash 函数MD5 输出的结果固定为 128 位。
流程
发送者A用私钥对摘要计算签名将明文和摘要的签名发给B。接受者 B 收到后拿签名部分用 B 的公钥解密可以解密成功得到摘要1就能证明确实是 B 发的。再对邮件内容明文使用相同的散列函数计算出摘要2与之前得到的摘要1进行对比两者一致就说明信息未被篡改。
Java和Python不同
java的小伙伴可能会这么说服务端保存私钥客户端保存公钥
客户端请求接口时用公钥加密服务端收到信息用私钥解密服务端返回的内容用私钥加密客户端收到后用公钥解密
这样用一对非对称密钥就可以完成整个交互的加密过程了并不像你说的公钥可以公开给任何人我们的公钥也是保密的只给到指定的人或客户端。这里的第2步其实是把公钥当私钥用了来个了公私钥角色互换。也没有人说这么做不可以反正只要保证“私钥”不泄漏就可以。
为了保证灵活性所以java允许这么做而python就要严格一点。
项目应用
电子邮件
这里不是指的落款而是对电子邮件进行数字签名以保证电子邮件传输中的机密性、完整性和不可否认性确保电子邮件通信各方身份的真实性。
软件下载
在网络上下载软件我们如何判断所下载的为原软件而不是被篡改后的软件呢这里就可以利用到数字签名软件作者可以对软件加上数字签名用户在软件下载之后验证数字签名看签名是否一致就可以识别出软件是否遭到篡改。
SSL/TLS
SSL/TLS客户端在认证服务器身份是否合法时会使用服务器证书它就是加上了数字签名的服务器公钥。相对地服务器为了对客户端用户进行认证也会使用客户端证书。