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(查看私钥的内容)
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 (参看公钥的内容)
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