CryptoSharp: Step 3

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 Encryption

ECB Decryption

对于每个分组采用相同的密钥进行独立加密,实现非常简单。使用List保存加密结果,明文分组通过BitConverter.ToUInt64()转换为QWORD输入上一篇实现的加密方法。

while(count > 0)
{
    QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8);
    qwlCipher.Add(Encrypt(token, qwKey));
    --count;
}

密文分组链接

CBC Encryption

CBC 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 Encryption

CFB 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 Encryption

OFB 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

你可能感兴趣的:(CryptoSharp: Step 3)