C#入门实践:Windows桌面加密器 CryptoSharp
Step 3 分组加密/数据分割
by Pixel Frame
GitHub: CryptoSharp
本篇中的图片来自维基共享资源
分组加密
上一篇中我们完成了DES加密算法的基本加解密功能,对于DES而言数据和密钥都是64bit(8 bytes),显然我们需要对数据进行分组以进行加密。数据分组有4中操作模式,即电码本(ECB)、密文分组链接(CBC)、密文反馈(CFB)、输出反馈(OFB)以及计数器(CTR),这在之后的AES自然也是相同的。四天王有五个是常识()
无论是字符串输入还是二进制文件输入,都会转换为byte
数组进行加密,对于CFB外的操作模式,都以8 bytes作为分组长度。CFB模式加密的明文是初始化向量IV,密文抛弃一定bit后与数据异或产生加密结果,因此一般直接以1 byte为分组,大大简化了分组过程。但实际上OFB模式也是对初始时变值进行加密,可以指定1-64bit的分组长度,但本程序实现时依然使用了64bit的分组长度。
分组数量通过Math.Ceiling
取上边值,最后一个分组需要补足到8 bytes。这里使用到了之前构建的ByteString
类。
int part = (int)Math.Ceiling(bsPlain.GetLength() / 8.0);
int rem = 8 - (bsPlain.GetLength() % 8);
bsPlain += new byte[rem];
电码本
ECB EncryptionECB Decryption
对于每个分组采用相同的密钥进行独立加密,实现非常简单。使用List<QWORD>
保存加密结果,明文分组通过BitConverter.ToUInt64()
转换为QWORD
输入上一篇实现的加密方法。
while(count > 0)
{
QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8);
qwlCipher.Add(Encrypt(token, qwKey));
--count;
}
密文分组链接
CBC EncryptionCBC Decryption
将明文与初始化向量异或后输入加密方法,加密结果作为密文和下一组的向量。
while (count > 0)
{
QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8) ^ qwIV;
qwIV = Encrypt(token, qwKey);
qwlCipher.Add(qwIV);
--count;
}
另外还有将密文和明文进行异或后作为下一组向量的CBC,即扩散密文分组链接PCBC。
while (count > 0)
{
QWORD qwPlain = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8);
qwIV = Encrypt(qwPlain ^ qwIV, qwKey);
qwlCipher.Add(qwIV);
qwIV ^= qwPlain;
--count;
}
密文反馈
CFB EncryptionCFB Decryption
将初始化向量和密钥进行加密,然后与明文分组异或产生密文。由于明文不是输入加密算法的量,所以可以取加密结果的8位与明文异或,同时解密时也只需要加密算法。这里的实现是取加密结果的高8位与明文分组异或。下一组的向量将本组向量左移8位再由密文填充空位。
foreach(byte token in baPlain)
{
QWORD qwEnc = Encrypt(qwIV, qwKey);
QWORD bEnc = (qwEnc >> 56) ^ token;
qwIV = (qwIV << 8) ^ bEnc;
qwlCipher.Add(bEnc);
}
输出反馈
OFB EncryptionOFB Decryption
与CFB相比将加密结果作为下一组的向量。这里的实现中分组依然为64bit而不是CFB的8bit。
while (count > 0)
{
qwIV = Encrypt(qwIV, qwKey);
QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8) ^ qwIV;
qwlCipher.Add(token);
--count;
}
计数器
和ECB相比将明文变为计数器,加解密双方通过相同的随机序列发生器发生Nonce来输入加密算法,加密结果与明文异或产生密文。由于本程序只有并不是通讯双方进行加密,所以未作实现。
CTR和ECB一样实现了加密的并行,但安全性要显然高于ECB,攻击者必须要知道随机序列发生器的产生序列和密钥。
至此,DES的基本功能就完成了,相对而言还是很简单的。下一篇中我们将开始RSA算法的实现。
次回予告:RSA#1 - BigInteger/Prime/PowMod/SteinGCD/ExEuclid
END_OF_PART_3Cry
网友评论