数据加密:RSA 加解密

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

内容简介:对于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传送门


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

查看所有标签

猜你喜欢:

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

Mastering Flask

Mastering Flask

Jack Stouffer / Packt Publishing / 2015-9-30 / USD 49.99

Work with scalable Flask application structures to create complex web apps Discover the most powerful Flask extensions and learn how to create one Deploy your application to real-world platforms......一起来看看 《Mastering Flask》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码