数据加密:RSA 加解密

栏目: 编程工具 · 发布时间: 7年前

内容简介:对于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
复制代码

Demo传送门


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML5

HTML5

Matthew David / Focal Press / 2010-07-29 / USD 39.95

Implement the powerful new multimedia and interactive capabilities offered by HTML5, including style control tools, illustration tools, video, audio, and rich media solutions. Understand how HTML5 is ......一起来看看 《HTML5》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具