本文主要是介绍常见加解密算法06 - 分组密码的填充与工作模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
各位英姿焕发,风华正茂的读者们你们好啊,今天我们讨论一下分组密码的填充与工作模式。
分组密码中,需要将明文按指定大小进行分组,由于明文并非指定大小的整数倍,因此在明文的最后一个分组需要将其填充至加密算法所要求的分组大小后进行加密。在解密时,按照同样的填充模式将填充的数据去除。
加密时填充,解密时删除,这就需要定一个规则,这个规则就是填充模式。
填充模式
NoPadding
不填充,在此填充下原始数据必须是分组大小的整数倍,非整数倍时无法使用该模式,会报错。
PKCS5Padding / PKCS7Padding
填充至符合块大小的整数倍,填充值为填充数量数,需要填充7个字节,就全部填07。
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
PKCS5Padding
的块大小应为 8 个字节,而 PKCS7Padding
的块大小可以在 1~255 的范围内。但 SunJCE 的 Provider 实现中 PKCS5Padding
也按 PKCS7Padding
来进行处理了。
有个细节,如果明文刚好是块的整数倍,也要加填充。
ISO10126Padding
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节随机处理。
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 3F 7A B4 09 14 36 07
ISO7816-4Padding
填充至符合块大小的整数倍,填充值第一个字节为 0x80,其他字节填 0。
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 80 00 00 00 00 00 00
ZeroBytePadding
填充至符合块大小的整数倍,填充值为 0
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
X923Padding
填充至符合块大小的整数倍,填充值最后一个字节为填充的数量数,其他字节填 0。
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 07
TBCPadding(Trailing-Bit-Compliment)
填充至符合块大小的整数倍,原文最后一位为“1”时填充 0x00,最后一位为“0”时填充“0xFF”。
-
原始:
FF FF FF FF FF FF FF FF FF
-
填充:
FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00
-
原始:
FF FF FF FF FF FF FF FF F0
-
填充:
FF FF FF FF FF FF FF FF F0 FF FF FF FF FF FF FF
PKCS1Padding
该填充模式是 RSA 加密中使用的,详见 RFC 2313。RSA 加密时,需要将原文填充至密钥大小,填充的格式为:
00 + BT + PS + 00 + D
-
00
为固定字节 -
BT
为处理模式。公钥操作时为02
,私钥操作为00
或01
-
PS
为填充字节,填充数量为k - 3 - D
,k
表示密钥长度,D
表示原文长度。PS
的最小长度为 8 个字节。填充的值根据BT
值不同而不同:-
BT = 00
时,填充全00
-
BT = 01
时,填充全FF
-
BT = 02
时,随机填充,但不能为00
-
工作模式
ECB模式
ECB(Electronic CodeBook)模式,即电子密码本模式。该模式是将明文分组,加密后直接成为密文分组,分组之间没有关系。
ECB模式是所有模式中最简单的一种,该模式的明文分组与密文分组是一一对应的关系,若明文分组相同,其密文分组也一定相同。因此,ECB模式也是最不安全的模式。
可使用该模式测试一下输入与输出:
https://gchq.github.io/CyberChef
可以看到,明文重复的时候,密文也是重复的,后面的是填充。
CBC模式
CBC(Cipher Block Chaining)模式,即密码分组链接模式。该模式首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。只有第一个明文分组特殊,需要提前为其生成一个与分组长度相同的比特序列,进行XOR运算,这个比特序列称为初始化向量(Initialization Vector),简称IV。
这里使用到了初始化向量。为了避免ECB模式引入的问题,使用初始化向量来随机化明文,然后将这种随机化传递下去。
CFB模式
CFB(Cipher FeedBack)模式,即密文反馈模式。该模式首先将前一个密文分组进行加密,再与当前明文分组进行XOR运算,来生成密文分组。同样CFB模式也需要一个IV。
OFB模式
OFB(Output FeedBack)模式,即输出反馈模式。该模式会产生一个密钥流,即将密码算法的前一个输出值,做为当前密码算法的输入值。该输入值再与明文分组进行XOR运行,计算得出密文分组。该模式需要一个IV,进行加密后做为第一个分组的输入。
CTR模式
CTR(CounTeR)模式,即计数器模式。该模式也会产生一个密钥流,它通过递增一个计数器来产生连续的密钥流。对该计数器进行加密,再与明文分组进行XOR运算,计算得出密文分组。
密文反馈(CFB,Cipher feedback)模式可以将块密码变为自同步的流密码。
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。
CTR模式也可以将块密码变成流密码。
之前见过,流秘密的特性是明文长度等于密文,我们可以测试一下 CFB 模式:
可以自行尝试一下,发现输出与输入确实是一样长的。
参考资料
https://zh.wikipedia.org/wiki/分组密码工作模式
这篇关于常见加解密算法06 - 分组密码的填充与工作模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!