加密算法知识(密钥交换方法和RSA基本原理)

done lin

加密算法知识

1、密钥交换算法

使用对称加密算法时,密钥交换是个大难题,所以DiffieHellman提出了著名的Diffie-Hellman密钥交换算法。

Diffie-Hellman密钥交换算法原理:

1)Alice与Bob确定两个大素数n和g,这两个数不用保密
(2)Alice选择另一个大随机数x,并计算A如下:A=gx mod n
(3)Alice将A发给Bob
(4)Bob选择另一个大随机数y,并计算B如下:B=gy mod n
(5)Bob将B发给Alice
(6)计算秘密密钥K1如下:K1=Bx mod n
(7)计算秘密密钥K2如下:K2=Ay mod n
K1=K2,因此Alice和Bob可以用其进行加解密 

RSA加密算法是基于这样的数学事实:两个大素数相乘容易,而对得到的乘积求因子则很难。加密过程如下:

(1)选择两个大素数P、Q
(2)计算N=P*Q
(3)选择一个公钥(加密密钥)E,使其不是(P-1)(Q-1)的因子
(4)选择私钥(解密密钥)D,满足如下条件:
          (D*E) mod (P-1)(Q-1)=1
(5)加密时,明文PT计算密文CT如下:
          CT=PTE mod N
(6)解密时,从密文CT计算明文PT如下:
          PT=CTDmodN 这也是SSL中会用一种密钥交换算法。 
 

2、散列算法:

主要用于验证数据的完整性,即保证时消息在发送之后和接收之前没有被篡改对于SSL中使用到的散列算法有MD5、SHA-1。

3、数字证书:

数字证书其实就是一个小的计算机文件,其作用类似于我们的身份证、护照,用于证明身份,在SSL中,使用数字证书来证明自己的身份,而不是伪造的。

4、简单的总结:

在SSL中会使用密钥交换算法交换密钥;使用密钥对数据进行加密;使用散列算法对数据的完整性进行验证,使用数字证书证明自己的身份。

5、 什么是OpenSSL

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

6、 基本功能

openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。

7、SSL协议实现

一些经过封装,方便你使用加解密和SSL的工具
****密钥、证书的编码格式和后缀名
目前有以下两种编码格式.

PEM - Privacy Enhanced Mail
打开看文本格式,以"-----BEGIN-----"开头, "-----END-----"结尾,
内容是Base64编码,查看PEM格式的信息可以用命令
openssl rsa -in my.pem -text -noout
Unix服务器偏向于使用这种编码格式.

DER - Distinguished Encoding Rules
打开看是二进制格式,不可读,查看DER格式的信息可以用命令
openssl rsa -in my.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.

8. 使用rsautl进行加密和解密操作,我们还是先看一下帮助文档

$ openssl rsautl -h
Usage: rsautl [options]                  
-in file        input file                                           //输入文件
-out file       output file                                          //输出文件
-inkey file     input key                                            //输入的密钥
-keyform arg    private key format - default PEM                     //指定密钥格式
-pubin          input is an RSA public                               //指定输入的是RSA公钥
-certin         input is a certificate carrying an RSA public key    //指定输入的是证书文件
-ssl            use SSL v2 padding                                   //使用SSLv23的填充方式
-raw            use no padding                                       //不进行填充
-pkcs           use PKCS#1 v1.5 padding (default)                    //使用V1.5的填充方式
-oaep           use PKCS#1 OAEP                                      //使用OAEP的填充方式
-sign           sign with private key                                //使用私钥做签名
-verify         verify with public key                               //使用公钥认证签名
-encrypt        encrypt with public key                              //使用公钥加密
-decrypt        decrypt with private key                             //使用私钥解密
-hexdump        hex dump output                                      //以16进制dump输出
-engine e       use engine e, possibly a hardware device.            //指定三方库或者硬件设备
-passin arg    pass phrase source                                    //指定输入的密码

9、openssl rsautl 基本的加解密使用

/*生成RSA密钥*/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem 

Generating RSA private key, 512 bit long modulus
............++++++++++++
...++++++++++++
e is 65537 (0x10001)

/*提取公钥*/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem 

/*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/
$ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt

/*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
$ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt

/*比较原始文件和解密后文件*/
$ diff plain.txt replain.txt 

/*使用公钥进行加密*/
$ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt

/*私钥进行解密*/
$ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt

/*比较原始文件和解密后文件*/
$ diff plain.txt replain1.txt

10、签名与验证操作

/*提取PCKS8格式的私钥*/
$ openssl pkcs8 -topk8 -in RSA.pem -passin pass:123456 -out pri.pem -nocrypt

/*使用RSA密钥进行签名,实际上使用私钥进行加密*/
$ openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass:123456 -out sign.txt

/*使用RSA密钥进行验证,实际上使用公钥进行解密*/
$ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt

/*对比原始文件和签名解密后的文件*/
$ diff plain.txt replain.txt 

/*使用私钥进行签名*/
$ openssl rsautl -sign -in plain.txt -inkey pri.pem  -out sign1.txt

/*使用公钥进行验证*/
$ openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt

/*对比原始文件和签名解密后的文件*/
$ cat plain replain1.txt

参考俩接:
https://www.jianshu.com/p/15b1d935a44b
來源:简书

猜你喜欢

转载自blog.csdn.net/mynameislinduan/article/details/83181534