内容简介:对于RSA加解密来说,在iOS的API中同样也是提供了这两种形式的方法。openssl 同样也提供了一系列的方法:相比较而言,openssl 提供的方法更为明确,比如:公钥解密,私钥解密,私钥加密,公钥解密。虽然 iOS 原生给出的只是加密和解密的方法,但是在方法注释中明确说了,加密用的就是公钥,解密用的就是私钥。
对于RSA加解密来说,在iOS的API中同样也是提供了这两种形式的方法。
SecKeyEncrypt(加密) SecKeyDecrypt(解密) 复制代码
openssl 同样也提供了一系列的方法:
RSA_public_encrypt RSA_private_encrypt RSA_public_decrypt RSA_private_decrypt 复制代码
相比较而言,openssl 提供的方法更为明确,比如:公钥解密,私钥解密,私钥加密,公钥解密。虽然 iOS 原生给出的只是加密和解密的方法,但是在方法注释中明确说了,加密用的就是公钥,解密用的就是私钥。
其实公钥加密私钥解密也是最常用的方式,私钥加密公钥解密用的并不多,但是私钥加密公钥解密有的时候也是需要的。如果真的需要私钥加密公钥解密,openssl 会更方便一点,但其实 iOS 也可以做私钥加密公钥解密。
这里大致说一下RSA加解密的过程:
1.生成密钥
公钥 (E,N) 私钥 (E,D,N) 复制代码
2.加解密
密文 = 明文<sup>E</sup> % N 明文 = 密文<sup>D</sup> % N
我们通过一个具体的例子来直观体验下,经过计算我们现在得到一对具体的密钥对:
公钥=(E,N) = (5,323) 私钥=(D,N) = (29,323) B = A<sup>E</sup> mod N = pow(123, 5) % 323 = 225 A = B<sup>D</sup> mod N = pow(225, 29) % 323 = 123
如果 A(123) 为明文,那上面的过程就是 公钥加密私钥解密;
如果 B(225) 为明文,那上面的过程就是 私钥加密公钥解密;
换一下顺序可能会更清除一点:
A = B<sup>D</sup> mod N = pow(225, 29) % 323 = 123 (私钥加密) B = A<sup>E</sup> mod N = pow(123, 5) % 323 = 225 (公钥解密)
这样一来我们就会发现,其实加解密是同一个方法。那为什么会有加密和解密两个方法呢?我的理解是:
加密就是,传入数据直接做计算(就像上面的那样)
解密就是,传入数据直接做计算(还是上面的那样),不过会根据填充模式做数据处理,把填充的随机数剔除掉。
所以从原理上来说私钥加密公钥解密是行的通的,只是需要自己做一些数据上的处理。具体实现可以看 Demo 。
2、分段加密
RSA算法本身要求加密内容也就是明文长度 m 必须 0<m<n ,也就是说内容这个大整数不能超过 n,否则就出错。那么如果 m=0,RSA加密器会直接返回全0结果。所以在对较长的数据进行加密的时候要把数据分段,每一段的数据长度不能大于模数长度(密钥长度)。
在实际的 RSA 加密中,分段的长度跟填充模式也有一定的关系:
填充方式 | 最大输入长度 | 输出长度 | 填充内容 |
---|---|---|---|
PKCS1 | keySize - 11 | keySize | 随机数 |
NONE | keySize - 1 | keySize | 00 |
有的文章说 padding 为 NONE 是的最大输入长度为 keySize,其实这样是有风险的。如果明文长度跟密钥长度一样的话,明文就有可能大于模数,这样在加密的时候就会出错。所以这里建议 padding 为 NONE 是明文的分段长度取 keySize - 1
。
分段加密之后就要分段解密了,在实际的RSA加密中,加密出来的密文总是等于密钥的长度,所以在分段解密的时候密文的分段大小直接取密钥长度。
3、填充模式
RSA在实际应用为了提高安全性防范各种攻击,在加解密过程中都需要添加一定的随机因素。为了让同一明文每次加密产生的密文都不一样,加密前先填充一部分随机数,这个不止RSA有,DES等对称加密也都有,称为padding。加密标准里有各种类型的padding标准,比如PCKS1。
对于PKCS1,这个填充格式会要求每次加密的数据比密钥长度短至少11个字节(keySize - 11),填充格式如下:
PS 为随机填充数,M为明文 00 02 | PS | 00 | M (公钥加密) 00 01 | PS | 00 | M (私钥加密) 复制代码
以 00 开头填充同时也保证了待加密数据不会大于密钥的模数。
还有一个比较常用的就是None(不填充),如果明文比密钥短的话会在明文的前面填充零(0)
0000 | M 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- NodeJS加密解密,node-rsa加密解密用法
- AES加密解密
- API加密框架原理解密
- Android中数据的加密解密
- Android中数据的加密解密
- golang crypto aes 加密,解密示例
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。