PKCS #1 RSA Encryption Version 1.5

Posted adylee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PKCS #1 RSA Encryption Version 1.5相关的知识,希望对你有一定的参考价值。

在进行RSA运算时需要将源数据D转化为Encryption block(EB)。其中pkcs1padding V1.5的填充模式安装以下方式进行

(1) EB = 00+ BT+PS +00 + D

说明

EB:为转化后Hex进制表示的数据块,长度为128个字节(密钥1024位的情况下)

00:开头为00。个人认为应该是一个保留位。因为目前BT的类型至于三种(00,01,02)一个字节就可以表示。

BT:用一个字节表示,在目前的版本上,有三个值00 01 02,如果使用公钥操作,BT永远为02,如果用私钥操作则可能为00或01。

PS:为填充位PS由k-3-D这么多个字节构成,k表示密钥的字节长度,如果我们用1024bit的RSA密钥,这个长度就是1024/8=128 ,D表示明文数据D的字节长度 

对于BT为00的,则这些字节全部为00,对于BT为01的这些值全部为FF,对于BT为02的,这些字节的值随机产生但不能是0字节(就是00)。

00:在源数据D前一个字节用00表示

D:实际源数据

公式(1)整个EB的长度就是密钥字节的长度。

对于BT为00的,数据D中的数据就不能以00字节开头,要不然会有歧义,因为这时候你PS填充的也是00,就分不清哪些是填充数据哪些是明文数据了
但如果你的明文数据就是以00字节开头怎么办呢?对于私钥操作,你可以把BT的值设为01,这时PS填充的FF,那么用00字节就可以区分填充数据和明文数据对于公钥操作,填充的都是非00字节,也能够用00字节区分开。如果你使用私钥加密,建议你BT使用01,保证了安全性。

对于BT为02和01的,PS至少要有8个字节长,BT为02肯定是公钥加密,01肯定是私钥加密,要保证PS有八个字节长
因为EB= 00+BT+PS+00+D=k

所以D<=k-11,所以当我们使用128字节密钥对数据进行加密时,明文数据的长度不能超过过128-11=117字节

当RSA要加密数据大于 k-11字节时怎么办呢?把明文数据按照D的最大长度分块然后逐块加密,最后把密文拼起来就行。

英文文档参考RFC 2313 PKCS #1: RSA Encryption

以上是关于PKCS #1 RSA Encryption Version 1.5的主要内容,如果未能解决你的问题,请参考以下文章

RSA PKCS#1在java中怎么实现?

RSA PKCS1 填充方式

在 Java 中生成 PKCS#1 格式的 RSA 密钥

RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换

如何从字符串获取 PKCS8 RSA 私钥/从 XML 获取 RSA 密钥对

PKCS 15 个标准