美文网首页
CryptoSharp: Step 3

CryptoSharp: Step 3

作者: PixelFrame | 来源:发表于2018-07-13 23:45 被阅读0次

    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<QWORD>保存加密结果,明文分组通过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

          本文链接:https://www.haomeiwen.com/subject/yihepftx.html