RSA加密

RSA基本原理:

RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密。

加签验签:

l  签名过程:

1.        A提取消息m的消息摘要h(m),并使用自己的私钥对摘要h(m)进行加密,生成签名s

2.        A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B。

l  验证过程:

1.        B接收到密文c,使用自己的私钥解密c得到明文m和数字签名s

2.        B使用A的公钥解密数字签名s解密得到H(m).

3.        B使用相同的方法提取消息m的消息摘要h(m)

4.        B比较两个消息摘要。相同则验证成功;不同则验证失败。


如果你想要理解通透,建议看这一篇博客,写的很好:

RSA算法原理(一)

RSA算法原理(二)


如何生成RSA公钥私钥(mac环境下)

一、使用OpenSSL来生成私钥和公钥(什么是OpenSSL,大家可以去谷歌)

1.  openssl version -a(请验证你的机器上已经安装了OpenSSL)

RSA加密_第1张图片

2.  openssl genrsa -out rsa_private_key.pem 1024(生成一个1024位私钥,名字为rsa_private_key.pem的文件)


3.  cat rsa_private_key.pem(查看私钥的内容)


RSA加密_第2张图片
内容都是标准的ASCII字符,密钥文件最终将数据通过Base64编码进行存储。可以看到上述密钥文件内容每一行的长度都很规律。这是由于RFC2045中规定:The encoded output stream must be represented in lines of no more than 76 characters each。也就是说Base64编码的数据每行最多不超过76字符,对于超长数据需要按行分割。

4.  openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout(根据名字为rsa_private_key.pem的私钥生成名字为rsa_public_key.pem的公钥)


5.  cat rsa_public_key.pem (参看公钥的内容)


生成的私钥文件编码是PKCS#1格式,这种格式 Java其实是支持的,一般要求PKCS#8编码,还需要进行PKCS#8编码: 

6.  openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt (输入私钥文件为rsa_private_key.pem,输出私钥文件为pkcs8_rsa_private_key.pem,不采用任何二次加密(-nocrypt))

7.  cat pkcs8_rsa_private_key.pem (查看PKCS#8编码之后的公钥内容)


RSA加密_第3张图片

至此,可用的密钥对已经生成好了,私钥使用pkcs8_rsa_private_key.pem,公钥采用rsa_public_key.pem。

注:如果采用PKCS#1格式,JAVA那边需要多写几句代码:

RSAPrivateKeyStructure asn1PrivKey =newRSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(priKeyData));

RSAPrivateKeySpec rsaPrivKeySpec =newRSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());

KeyFactory keyFactory= KeyFactory.getInstance("RSA");

PrivateKey priKey= keyFactory.generatePrivate(rsaPrivKeySpec);


二、iOS代码实测:


RSA加密_第4张图片

参考文献:

RSA介绍:http://baike.baidu.com/view/7520.htm

OpenSSL介绍:http://baike.baidu.com/view/300712.htm

在线生成公钥私钥

你可能感兴趣的:(RSA加密)