密码学专题 - 分组密码
分组密码是密码系统的基本组成部分这一。可以说分组密码是密码学最容易理解的部分,在大多数应用中都不会直接使用分组密码,而是以所谓的 “工作模式” 来使用分组密码。
3.1 什么是分组密码
分组密码是加密固定长度数据分组的加密函数。最新一代分组密码的分组长度为 128 位 (16 字节),这些分组密码加密 128 位的明文以产生 128 位的密文。分组密码是可逆的,有一个解密函数将 128 位密文解密得到原先的 128 位明文。明文和密文的长度总是相同,我们将它称为分组密码的分组长度。
用分组密码进行加密,我们需要一个密钥,没有密钥就无法隐藏消息。就像明文和密文一样,密钥也是一个化位串,常见的密钥长度为 128 和 256 位。
分组密码用于多种用途,其中最主要的是加密信息。然而出于安全性考虑,人们很少直接使用分组密码。相反,人们通常在实际中利用分组密码工作模式。
可以把分组密码看作一个非常庞大的密钥映射表。对于任何固定的密钥,可以计算出一个查找表,用于明文到密文的映射。这个表相当巨大,对于一个分组长度为 32 位的分组密码,该表大小为 16GB;如果分组长度为 64 位,那么查找表的大小为 1.5 亿 TB;如果分组长度增至 128 位,表的大小将会是 字节,如此大的数字甚至不能用现有的计数单位来计数。当然,在现实中建立这样的表是不切实际的,但这是一个有用的概念模型。由于分组密码是可逆的,也就是说表中没有两项明文对应的密文是相同的,否则解密函数不可能将密文解密为唯一的明文。因此这个庞大的表将包含所有可能的密文值一次。这就是数学家所谓的置换:该表包括了所有元素的重新排序。一个分组长度为 k 位的分组密码对于每一个密钥都对应一个 k 位值的转换。
在这里说明一点,分组密码的输出密文一般不能是明文字符串直接置换所得到的值。需要验证所有的 k 位输入的 个可能值和对应的 k 位输出。举一个例子,如果 ,输入 00000001
可以使用某个密钥加密为密文 01000000
,如果选择不同的密钥加密,也可能得到 11011110
,这取决于对分组密码的设计。
项目源代码
项目源代码会逐步上传到 Github,地址为 https://github.com/windstamp。
Contributor
- Windstamp, https://github.com/windstamp
网友评论