RSA非对称 详细理解与使用

来源:互联网 发布:股票买卖软件下载3.0 编辑:程序博客网 时间:2024/05/19 22:04

        最近正好在写关于支付的项目,在这里把RSA非对称的理解记录,整合一下

        RSA算法:1977年由Ron Rivest、Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字。算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥。该算法能够抵抗目前已知的所有密码攻击。RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密。我们在进行RSA加密通讯时,一般公钥可公示,私钥留在自己这边保密。

        先来简单的理解下,RSA中的加密解密,加签解签的概念理解
       加密,解密:
        加密:对所需要安全性保证的的信息,进行加密处理。在RSA中可以理解为用自己的公钥对数据进行加密,用自己的私钥对数据进行解密得到正确数据的过程。因为,公钥是可以公示的,所以,所有想给此服务器发送数据的请求方,都可以用服务器公示的公钥对数据进行加密处理,然后发给服务器
        解密:对于服务器方而言,接收到了加密处理后的数据信息,则可以用自己(服务器)的私钥进行解密。因为私钥是本地保存的,所以保证私钥的安全性基本就可以保证数据的安全性

  公钥私钥的原则:

  1. 一个公钥对应一个私钥。
  2. 密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
  3. 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
  4. 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密

PS:其实公钥和私钥都可以用来加密或解密---只要能保证用A加密,就用B解密就行。至于A是公钥还是私钥,其实可以根据不同的用途而定
     
            
             加签,验签:有没有出现一个问题就是,非信任第三方把发送数据的请求方的数据截取,换成了错误或者危险的数据,传递给服务器方呢。比如,把存入现金改成一个亿,银行卡账号改成自己的。其实,在没有其他的安全保护措施下,还是很有可能的。那么,有个很大的问题就出现了,就是要保证数据的发送方,是服务器知道的,安全的发送方,即进行加签,接受的时候对这个加签数据进行验签操作,判断其身份是真实可靠的
             加签:发送方发送数据的时候,用发送方自己的私钥进行加签操作。然后将加签后的数据和其他的数据一起发送给服务器。
        验签:服务器接受请求方请求后,用发送方的公钥对加签字段进行验签操作。因为,对方私钥是保密的,所以基本可以通过对方私钥的加签,和对方公钥的解签得到安全的身份认证

        关于专有名词的理解,差不多了。现在有个问题,一直提的,服务器方有私钥和公钥。发送方也有公钥和私钥。那么这个是怎么生成的?

 一般是通过  “openssl”  生成RSA公私钥对(其余的方法可以自己研究下,如代码的算法生成等)

1.从网上下载openssl工具:http://www.slproweb.com/products/Win32OpenSSL.html

   2.生成私钥

进入到openssl的bin目录下,执行以下命令:

openssl genrsa -out rsa_private_key.pem 1024

会在bin目录下看到新生成的私钥文件rsa_private_key.pem,文件内容如下:

Xml代码  收藏代码
  1. -----BEGIN RSA PRIVATE KEY-----  
  2. MIICXgIBAAKBgQDtd1lKsX6ylsAEWFi7E/ut8krJy9PQ7sGYKhIm9TvIdZiq5xzy  
  3. aw8NOLzKZ1k486MePYG4tSuoaxSbwuPLwVUzYFvnUZo7aWCIGKn16UWTM4nxc/+d  
  4. wce+bhcKrlLbTWi8l580LTE7GxclTh8z7gHq59ivhaoGbK7FNxlUfB4TSQIDAQAB  
  5. AoGBAIgTk0x1J+hI8KHMypPxoJCOPoMi1S9uEewTd7FxaB+4G5Mbuv/Dj62A7NaD  
  6. oKI9IyUqE9L3ppvtOLMFXCofkKU0p4j7MEJdZ+CjVvgextkWa80nj/UZiM1oOL6Y  
  7. HwH4ZtPtY+pFCTK1rdn3+070qBB9tnVntbN/jq0Ld7f0t7UNAkEA9ryI0kxJL9Pu  
  8. pO9NEeWuCUo4xcl9x/M9+mtkfY3VoDDDV1E/eUjmoTfANYwrjcddiQrO0MLyEdoo  
  9. tiLpN77qOwJBAPZhtv/+pqMVTrLxWnVKLZ4ZVTPPgJQQkFdhWwYlz7oKzB3VbQRt  
  10. /jLFXUyCN2eCP7rglrXnaz7AYBftF0ajHEsCQQDDNfkeQULqN0gpcDdOwKRIL1Pp  
  11. kHgWmWlg1lTETVJGEi6Kx/prL/VgeiZ1dzgCTUjAoy9r1cEFxM/PAqH3+/F/AkEA  
  12. zsTCp6Q2hLblDRewKq7OCdiIwKpr5dbgy/RQR6CD7EYTdxYeH5GPu1wXKJY/mQae  
  13. JV9GG/LS9h7MhkfbONS6cQJAdBEb5vloBDLcSQFDQO/VZ9SKFHCmHLXluhhIizYK  
  14. Gzgf3OXEGNDSAC3qy+ZTnLd3N5iYrVbK52UoiLOLhhNMqA==  
  15. -----END RSA PRIVATE KEY-----  

    3.生成公钥

在bin目录下,执行以下命令:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

会在bin目录下看到新生成的公钥文件rsa_public_key.pem,文件内容如下:

Xml代码  收藏代码
  1. -----BEGIN PUBLIC KEY-----  
  2. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtd1lKsX6ylsAEWFi7E/ut8krJ  
  3. y9PQ7sGYKhIm9TvIdZiq5xzyaw8NOLzKZ1k486MePYG4tSuoaxSbwuPLwVUzYFvn  
  4. UZo7aWCIGKn16UWTM4nxc/+dwce+bhcKrlLbTWi8l580LTE7GxclTh8z7gHq59iv  
  5. haoGbK7FNxlUfB4TSQIDAQAB  
  6. -----END PUBLIC KEY-----  
  如果在实际使用过程中
签名报以下错误:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence

则说明rsa私钥的格式不是pksc8格式,需要使用以下命令转换一下:

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

然后再提取去除头和尾以及换行符后字符串作为java版用的rsa私钥

           

  到这里 一组属于自己的公私钥对也就搞好了

             

        

0 0