HTTPS简介:非对称加密RSA

Posted go2coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPS简介:非对称加密RSA相关的知识,希望对你有一定的参考价值。

我们如何决定密钥是什么?

如果只有发送方和接收方知道密钥,对称密钥密码术是很安全的。在凯撒密码中,密钥是一个偏移值,这个偏移值决定每个字母应该偏移多少。在我们的例子中,我们使用的偏移值是 3,但是也能是 4 或者 12。

不过这么设计会有个问题:在用信鸽传递信息之前,如果 Alice 和 Bob 之前从没见过,他们没有安全的方式创建一个密钥。如果他们将密钥包含在信息之中,Mallory 将拦截信息并且发现密钥。后果就是:无论 Alice 和 Bob 发送的信息是否加密,Mallory 都能读取或者改变拦截到的信息。

这是一个典型的中间人攻击例子。避免它的唯一方法是改变之前的密码系统。

那么有没有这种方式,Alice 和 Bob 之前从没见过,Alice 想要给 Bob 传递一条信息,一开始Alice 先写一封空的信给Bob ,Bob发一个密钥给Alice。这个密钥要一个特点只能用来加密,对自己加密的文件都没办法解密,只有Bob 才能够解开。也就是说在密钥在传输的过程中即使被Mallory 截获了信鸽,Mallory知道了这个密钥,拿到了这个密钥也只是用来加密,他即使接下里截获到了Alice 用大家都拿到的密钥加密信息发给 Bob的信件,他也没办法解开密文。

这是另外一套密码系统。

他跟之前的有不一样的地方,第一就是他需要两次通讯过程,第二就是给出去的密钥只能用来加密无法用来解密。

这种在网络中传输,可能被很多人截获的密钥,叫做公钥,Bob 用来解开密文的密码较为私钥。

RSA算法

上面的这套密码系统重要的一点是加密和解密能够分开,加密和解密能够分开,加密和解密不是简简单单互逆过程,即使是加密的人,自己都没办法解开。这样就安全多了。用数学表达:加密:$$Y=E(X)$$ 其中 X表示明文,Y表示经过函数E转换后的值即密文。解密:$$X=E(Y)$$ 这里跟上面f(反函数)不同的是E,D不是互逆的。

现在就是来找E,D了,已经有人找好了,先看看:

加密公式:

$$X^e mod N = Y$$

解密公式:

$$X = Y^d mod N$$

这个公式是怎么工作的:

取N = 319 ,e = 17,d=33

现在要加密的数X = 40

密文$Y=40^{17} mod 319$计算得到Y=61。这样就完成了加密的过程,在这个过程中我们用到了两个数,N(319),e(17)。d(33)我们是没有给的,他没办法进行解密。

不信试试

$$61^{17} mod 319=118$$

而用d(33)进行解密

$$61^{33} mod 319=40$$

刚才加密的是40,结果是正确的。

这种加密方式为RSA加密算法。拥有公钥和密钥。

openssl中的RSA过程

理论的知识有了,我们不需要自己编写代码来实现这一个过程,强大的 openssl可以很好的实现这一个过程,如果还没有安装 openssl,可以自行安装。

使用 openssl 建立这一个过程,首先,创建私钥:

 
   
   
 
  1. openssl genrsa -out private_key.pem 2048

显示创建成功:

 
   
   
 
  1. Generating RSA private key, 2048 bit long modulus

  2. ............+++

  3. ..........................+++

  4. e is 65537 (0x10001)

Bob 拥有了这个私钥,当Alice 要过来跟他通讯的时候,第一次发送公钥给Alice ,公钥的生成如下:

 
   
   
 
  1. root@ubuntu:~/openssl_ca/new_rsa# openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout

  2. writing RSA key

Alice 拿到了 public_key.pem 公钥,对需要的文件进行加密,假设信的名称为hellofile.txt

 
   
   
 
  1. echo "Welcome in my worls." > hellofile.txt

使用公钥对hellofile.txt 进行加密。

 
   
   
 
  1. openssl rsautl -encrypt -inkey public_key.pem -pubin -in hellofile.txt -out hellofile_encrypt.dat

得到了hellofile_encrypt.dat,这时候公钥是无法解密的。

 
   
   
 
  1. root@ubuntu:~/openssl_ca/new_rsa# openssl rsautl -decrypt -inkey public_key.pem -in hellofile_encrypt.dat -out new_hellofile.txt

  2. unable to load Private Key

  3. 140480186250904:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: ANY PRIVATE KEY

Alice 使用公共网络把hellofile_encrypt.dat文件发给Bob ,Bob 使用私钥解密该文件。

 
   
   
 
  1. openssl rsautl -decrypt -inkey private_key.pem -in hellofile_encrypt.dat -out new_hellofile.txt

查看new_hellofile.txt 的内容。

 
   
   
 
  1. root@ubuntu:~/openssl_ca/new_rsa# cat new_hellofile.txt

  2. Welcome in my worls.

openssl中的数字证书过程

加密公式:

$$X^e mod N = Y$$

解密公式:

$$X = Y^d mod N$$

这个过程是RSA的加密过程,逆过程是数字证书的签名过程。

生成数字证书:

$$X = Y^d mod N$$

得到X的签名证书,把证书X和源文件Y发个客户端,客户端进行验证。

验证签名:

$$X^e mod N = Y$$

如软件的签名证书,在打包软件的时候使用私钥生成数字签名软件,在客户端使用公钥进行签名的验证。这是一个很好地防止软件包被修改的方法。

把刚才生成公钥和私钥的过程构建为脚本:

generate_cert.sh

 
   
   
 
  1. #!/bin/bash

  2. echo $1

  3. #Step 1: Generate a Private Key

  4. echo -------------------------------------------- 1

  5. openssl genrsa -des3 -out $1.key 1024

  6. #Step 2: Generate a CSR (Certificate Signing Request)

  7. echo -------------------------------------------- 2

  8. openssl req -new -key $1.key -out $1.csr

  9. #Step 3: Remove Passphrase from Key

  10. echo -------------------------------------------- 3

  11. cp $1.key $1.key.org

  12. openssl rsa -in $1.key.org -out $1.key

  13. #Step 4: Generating a Self-Signed Certificate

  14. echo -------------------------------------------- 4

  15. openssl x509 -req -days 365 -in $1.csr -signkey $1.key -out $1.crt

  16. #Step 5: Generating PEM Certificate

  17. echo ---------------------- 5

  18. cat $1.crt > $1.pem

  19. cat $1.key >> $1.pem

  20. echo -------------------------------------------- TERMINATED

生成s2e.pem 公钥密钥。

 
   
   
 
  1. generate_cert.sh s2e

创建 ok.p7e

 
   
   
 
  1. echo "verify " > ok.p7e

对文件进行签名:

 
   
   
 
  1. openssl cms -sign -binary -in ok.p7e -out ok.p7e.p7m.pem -nodetach -outform DER -signer s2e.pem

参看签名后的文件 ok.p7e.p7m.pem。

 
   
   
 
  1. 0<82>^Dk^F *<86>H<86>÷^M^A^G^B <82>^D\0<82>^DX^B^A^A1^M0^K^F `<86>H^Ae^C^D^B^A0^W^F *<86>H<86>÷^M^A^G^A

  2. ^D^Hverify

  3. <82>^B/0<82>^B+0<82>^A<94>^B ^@ÕZ£ê<84>^Q^V<86>0^M^F *<86>H<86>÷^M^A^A^K^E^@0Z1^K0 ^F^CU^D^F^S^Bcn1^K0 ^F^CU^D^H^L^Bfj1^K0 ^F^CU^D^G^L^Bxm1^Q0^O^F^CU^D

  4. ^L^Hchox Ltd1^M0^K^F^CU^D^K^L^Ddemo1^O0^M^F^CU^D^C^L^Fxx.com0^^^W^M181128080158Z^W^M191128080158Z0Z1^K0 ^F^CU^D^F^S^Bcn1^K0 ^F^CU^D^H^L^Bfj1^K0 ^F^CU^D^G^L^Bxm1^Q0^O^F^CU^D

  5. ^L^Hchox Ltd1^M0^K^F^CU^D^K^L^Ddemo1^O0^M^F^CU^D^C^L^Fxx.com0<81><9f>0^M^F *<86>H<86>÷^M^A^A^A^E^@^C<81><8d>^@0<81><89>^B<81><81>^@¨Ê|^NË'ôglr<82>Ú^Uýã?<90>ÚaÈñ Cé£eÈØ5s¢Ü4^S^AnëSJBëÏ<9e>KráÊ<99>sâsð!^Nª^Rð×W^M^H÷Ûl´^CHÉÎnqi<82>,<8b>^P^C'õùÖ^ZLKV=¾ñ.^[<9a>^MS^MÞötG@ W9<81>^X<98>¯}n<99>^\Æ~´È^Gä^U<92>´\±z-Î>p»^B^C^A^@^A0^M^F *<86>H<86>÷^M^A^A^K^E^@^C<81><81>^@^FÖoúèÆ=Äç<8a>§m7^E¦0Ë£<97>C^U3<8c>KYÜÃäeä<94>^Mù^P¾^Wà<8c>78~Vi±Û^A^Oä51WA0^E^M^L

  6. Òµ<99><8c>Å)OÃËãÃ9î4ò<9f>6§Á<^Ra<9a><80><9e>y,ù^^<91>$7ò]76º<83> <8d>Æ(:ʶGFSô<80>4V.¼²sÈàxþééM<99>âú<9f><84>Ý·p1<82>^Aö0<82>^Aò^B^A^A0g0Z1^K0 ^F^CU^D^F^S^Bcn1^K0 ^F^CU^D^H^L^Bfj1^K0 ^F^CU^D^G^L^Bxm1^Q0^O^F^CU^D

  7. ^L^Hchox Ltd1^M0^K^F^CU^D^K^L^Ddemo1^O0^M^F^CU^D^C^L^Fxx.com^B ^@ÕZ£ê<84>^Q^V<86>0^K^F `<86>H^Ae^C^D^B^A <810^X^F *<86>H<86>÷^M^A ^C1^K^F *<86>H<86>÷^M^A^G^A0^\^F *<86>H<86>÷^M^A ^E1^O^W^M181129095832Z0/^F *<86>H<86>÷^M^A ^D1"^D QÿBÃÓ¹^H<96> B<9a>L^MÊ~m<84><99>cÛÿ¦Ø:+Dº\ `Gc0y^F *<86>H<86>÷^M^A ^O1l0j0^K^F `<86>H^Ae^C^D^A*0^K^F `<86>H^Ae^C^D^A^V0^K^F `<86>H^Ae^C^D^A^B0

  8. ^F^H*<86>H<86>÷^M^C^G0^N^F^H*<86>H<86>÷^M^C^B^B^B^@<80>0^M^F^H*<86>H<86>÷^M^C^B^B^A@0^G^F^E+^N^C^B^G0^M^F^H*<86>H<86>÷^M^C^B^B^A(0^M^F *<86>H<86>÷^M^A^A^A^E^@^D<81><80>)ñ7BUXYÓ^N?Ü^T@ÝÝõµf©E^P^U<95>SÌ2ÿ<83>ð,Û^Yè^Nç8.<8e>û<8b>6}^H<8a>50^E<94>çËÏ!Çr<8c>BJNffÄgû:^L<83>©^GMkk<98>

  9. µï^^<97>nqë^\^HÄ>Ï(\^H<86>^GHaâ<87>^Zrþ9¹<9a><90>ßÇ@ÏôåÐçTiô^\^?

  10. ^ECa>M]°¹­Ì^^ÑÃ

验证文件签名文件:

 
   
   
 
  1. openssl cms -verify -noverify -in ok.p7e.p7m.pem

如果签名完以后的文件被修改以后,验证无法通过。


转载请标明来之:go2coding


以上是关于HTTPS简介:非对称加密RSA的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Config - RSA简介以及使用RSA加密配置文件

密码学第五讲-非对称加密RSA原理简介及使用

源码基于最优非对称加密填充的RSA加密

RSA 非对称加密

.NET Core加解密实战系列之——RSA非对称加密算法

使用OpenSSL进行RSA非对称加密(C++版本)