问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

加密算法之PKCS填充

创作时间:
作者:
@小白创作中心

加密算法之PKCS填充

引用
1
来源
1.
https://www.cnblogs.com/SevensNight/p/18766180

PKCS介绍

一些加密方式,例如 AESECB , CBC , PCBC 模式加密时,如果明文分块没有对齐,则需要填充,填充有很多种方式,本章描述的正是填充方式

公钥加密 标准(Public Key Cryptography Standards, PKCS),由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请,证书更新,证书作废表发布,扩展证书内容以及数字签名,数字信封的格式等方面的一系列相关协议,下表是 PKCS 规范汇总,稍作了解即可

|

 **版本**  |

 **名称**  |

\*\* 简介\*\* |

| --- | --- | --- | --- | --- | --- | --- | --- | --- |

PKCS #1 |

2.1 |

RSA密码编译标准(RSA Cryptography Standard) |

定义了RSA的数理基础,公/私钥格式,以及加/解密,签/验章的流程,1.5版本曾经遭到攻击 |

PKCS #2 |

- |

撤销 |

原本是用以规范RSA加密摘要的转换方式,现已被纳入PKCS#1之中 |

PKCS #3 |

1.4 |

DH密钥协议标准(Diffie-Hellman key agreement Standard) |

规范以DH密钥协议为基础的密钥协议标准,其功能,可以让两方通过金议协议,拟定一把会议密钥(Session key) |

PKCS #4 |

- |

撤销 |

原本用以规范转换RSA密钥的流程,已被纳入PKCS#1之中 |

PKCS #5 |

2.0 |

密码基植加密标准(Password-based Encryption Standard) |

参见RFC 2898与PBKDF2 |

PKCS #6 |

1.5 |

证书扩展语法标准(Extended-Certificate Syntax Standard) |

将原本X.509的证书格式标准加以扩充 |

PKCS #7 |

1.5 |

密码消息语法标准(Cryptographic Message Syntax Standard) |

参见RFC 2315,规范了以[公开密钥基础设施(PKI)所产生之签名/密文之格式,其目的一样是为了拓展数字证书的应用,其中,包含了S/MIME与CMS |

PKCS #8 |

1.2 |

私钥消息表示标准(Private-Key Information Syntax Standard) |

Apache读取证书私钥的标准 |

PKCS #9 |

2.0 |

选择属性格式(Selected Attribute Types) |

定义PKCS#6,7,8,10的选择属性格式 |

PKCS #10 |

1.7 |

证书申请标准(Certification Request Standard) |

参见RFC 2986,规范了向证书中心申请证书之CSR(certificate signing request)的格式 |

PKCS #11 |

2.20 |

密码设备标准接口(Cryptographic Token Interface(Cryptoki)) |

定义了密码设备的应用程序接口(API)之规格 |

PKCS #12 |

1.0 |

个人消息交换标准(Personal Information Exchange Syntax Standard) |

定义了包含私钥与公钥证书(public key certificate)的文件格式,私钥采密码(password)保护,常见的PFX就履行了PKCS#12 |

PKCS #13 |

– |

椭圆曲线密码学标准(Elliptic curve cryptography Standard) |

制定中.规范以椭圆曲线密码学为基础所发展之密码技术应用;椭圆曲线密码学是新的密码学技术,其强度与效率皆比现行以指数运算为基础之密码学算法来的优秀,然而,该算法的应用尚不普及 |

PKCS #14 |

– |

拟随机数产生器标准(Pseudo-random Number Generation) |

制定中.规范拟随机数产生器的使用与设计 |

PKCS #15 |

1.1 |

密码设备消息格式标准(Cryptographic Token Information Format Standard) |

定义了密码设备内部数据的组织结构 |

对称加密常用的是PKCS#5和PKCS#7 Padding;而非对称的填充算法常用的是PKCS#1_v1.5以及OAEP(PKCS#1_v2)

PKCS#1_PADDING

从上表也可以看出, PKCS#1 针对的是RSA算法;RSA加密数据的长度和密钥位数有关,常用的密钥长度有1024bits,2048bits等,理论上1024bits的密钥可以加密的数据最大长度为1024bits(即1024/8= 128bytes),2048bits的密钥可以加密的数据最大长度为2048bits(2048/8=256bytes),但是RSA在实际应用中不可能使用这种"教科书式的RSA"系统,实际应用中RSA经常与填充技术(padding)一起使用,可以增加RSA的安全性,填充技术如果比较弱,较小的明文和小型公开指数e将易于受到攻击

RSA有如下三种填充方式:

填充方式 |

输入 |

输出 |

| --- | --- | --- | --- | --- | --- | --- |

RSA_PKCS1_PADDING |

必须比RSA秘钥短至少11个字节,也就是RSA_size(rsa) – 11 |

和秘钥一样长 |

RSA_PKCS1_OAEP_PADDING |

RSA_size(rsa) – 41 |

和秘钥一样长 |

RSA_NO_PADDING |

可以和RSA秘钥一样长,如果输入的明文过长,必须切割,然后填充 |

和秘钥一样长 |

1.1 RSA_PKCS1_PADDING(V1.5)

PKCS1_PADDING_V1.5 是RSA加解密默认的填充方式;在进行RSA运算时需要将源数据D转化为Encryption block(EB),其中 PKCS1_PADDING_V1.5 的填充模式按照以下方式进行

EB = 00 + BT + PS + 00 + D
  • EB: 为填充后的16进制加密数据块,长度为1024/8=128字节(密钥长度1024位的情况下)

  • 00: 开头为00,是一个保留位

  • BT: 用一个字节表示,在目前的版本上,有三个值00,01,02,如果使用公钥操作,BT为02(加密),如果用私钥操作则可能为00或01(签名)

  • PS: 填充位,PS=k-3-D个字节,k表示密钥的字节长度,如果我们用1024bit的RSA密钥,k=1024/8=128字节,D表示明文数据D的字节长度,如果BT为00,则PS全部为00,如果BT为01,则PS全部为FF,如果BT为02,PS为随机产生的非0x00的字节数据

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

  • D: 实际源数据

由上可知,当使用 RSA_PKCS1_PADDING 填充时,BT=2,明文前填充的PS是随机值,所以相同的明文,相同的公钥加密得到的密文是不同的,这在一定程度上提高了RSA算法的安全性,由于 PKCS#1 规范建议PS的最小长度为8,所以可加密的明文最大长度为密钥长度-3-8,即小于等于密钥长度-11

1.2 RSA_PKCS1_OAEP_PADDING

RSA_PKCS1_OAEP_PADDING 填充模式是 PKCS#1 推出的新填充方式, RSA_PKCS1_PADDING(V1.5) 的缺点是无法验证解密的结果的正确性,为了解决该问题, RSA_PKCS1_OAEP_PADDING 引入了类似HMAC消息验证码的算法(可见4.2小节),原理就是填充了一些与原文相关的哈希值,解密后可以进行验证,大致流程如下图所示

  1. 生成一个k0位的随机数r

  2. 原文m补上k10,得到消息M,k1=n-size(m)-k0

  3. 补位后的消息Mhash函数进行异或操作,得到X

  4. 然后随机数rXhash值进行异或操作,得到Y

  5. XY合并成补位后的消息

RSA_PKCS1_OAEP_PADDING 是目前RSA填充方式里安全性最高的一种,代价则是可加密的明文长度较短(密钥长度-41)

1.3 RSA_NO_PADDING

RSA_NO_PADDING 填充方式并不表示无填充,当选择 RSA_NO_PADDING 填充模式时,如果明文不够128字节(RSA1024的情况),加密的时候会在明文前面填充若干数据0,直至达到128字节;解密后的明文也会包括前面填充的零,需要注意把解密后的字段前向填充的零去掉,才是真正的明文

1.4 PKCS#1 RSA算法pem文件结构介绍

PKCS#1 RSA 算法标准中定义RSA公钥结构如下

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

PKCS#1 RSA 算法标准中定义RSA私钥结构如下

RSAPrivateKey ::= SEQUENCE {

version Version,

modulus INTEGER, -- n

publicExponent INTEGER, -- e

privateExponent INTEGER, -- d

prime1 INTEGER, -- p

prime2 INTEGER, -- q

exponent1 INTEGER, -- d mod (p-1) (dp)

exponent2 INTEGER, -- d mod (q-1) (dq)

coefficient INTEGER, -- (inverse of q) mod p (inv)

otherPrimeInfos OtherPrimeInfos OPTIONAL

}

PKCS#7_PADDING

假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n,如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小,这么做是为了与长度不对齐的情况保持处理流程一致

PKCS#5_PADDING

PKCS#5_PADDINGPKCS#7_PADDING 的子集,即块大小固定为8字节, PKCS#5_PADDING 方式加密可以用 PKCS#7_PADDING 方式解密,而 PKCS#7_PADDING 加密则不一定可以用 PKCS#5_PADDING 方式解密,除非块大小是8

ZeroPadding

数据长度不对齐时使用0填充,否则不填充;用 ZeroPadding 填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号