Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

数据加密:RSA 加解密

0
0

对于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 复制代码

Demo传送门


Viewing all articles
Browse latest Browse all 12749