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公钥私钥(mac环境下)
一、使用OpenSSL来生成私钥和公钥(什么是OpenSSL,大家可以去谷歌)
1. openssl version -a(请验证你的机器上已经安装了OpenSSL)
2. openssl genrsa -out rsa_private_key.pem 1024(生成一个1024位私钥,名字为rsa_private_key.pem的文件)
3. cat rsa_private_key.pem(查看私钥的内容)
内容都是标准的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编码之后的公钥内容)
至此,可用的密钥对已经生成好了,私钥使用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介绍:http://baike.baidu.com/view/7520.htm
OpenSSL介绍:http://baike.baidu.com/view/300712.htm










网友评论