C#入門實踐:Windows桌面加密器 CryptoSharp
Step 3 分組加密/數(shù)據(jù)分割
by Pixel Frame
GitHub: CryptoSharp
本篇中的圖片來自維基共享資源
分組加密
上一篇中我們完成了DES加密算法的基本加解密功能辕翰,對于DES而言數(shù)據(jù)和密鑰都是64bit(8 bytes),顯然我們需要對數(shù)據(jù)進行分組以進行加密尝江。數(shù)據(jù)分組有4中操作模式,即電碼本(ECB)段只、密文分組鏈接(CBC)咬崔、密文反饋(CFB)、輸出反饋(OFB)以及計數(shù)器(CTR)胆胰,這在之后的AES自然也是相同的狞贱。四天王有五個是常識()
無論是字符串輸入還是二進制文件輸入,都會轉(zhuǎn)換為byte
數(shù)組進行加密蜀涨,對于CFB外的操作模式瞎嬉,都以8 bytes作為分組長度。CFB模式加密的明文是初始化向量IV勉盅,密文拋棄一定bit后與數(shù)據(jù)異或產(chǎn)生加密結(jié)果佑颇,因此一般直接以1 byte為分組,大大簡化了分組過程草娜。但實際上OFB模式也是對初始時變值進行加密,可以指定1-64bit的分組長度痒筒,但本程序?qū)崿F(xiàn)時依然使用了64bit的分組長度宰闰。
分組數(shù)量通過Math.Ceiling
取上邊值,最后一個分組需要補足到8 bytes簿透。這里使用到了之前構(gòu)建的ByteString
類移袍。
int part = (int)Math.Ceiling(bsPlain.GetLength() / 8.0);
int rem = 8 - (bsPlain.GetLength() % 8);
bsPlain += new byte[rem];
電碼本
對于每個分組采用相同的密鑰進行獨立加密,實現(xiàn)非常簡單老充。使用List<QWORD>
保存加密結(jié)果葡盗,明文分組通過BitConverter.ToUInt64()
轉(zhuǎn)換為QWORD
輸入上一篇實現(xiàn)的加密方法。
while(count > 0)
{
QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8);
qwlCipher.Add(Encrypt(token, qwKey));
--count;
}
密文分組鏈接
將明文與初始化向量異或后輸入加密方法啡浊,加密結(jié)果作為密文和下一組的向量觅够。
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;
}
密文反饋
將初始化向量和密鑰進行加密喘先,然后與明文分組異或產(chǎn)生密文。由于明文不是輸入加密算法的量廷粒,所以可以取加密結(jié)果的8位與明文異或窘拯,同時解密時也只需要加密算法。這里的實現(xiàn)是取加密結(jié)果的高8位與明文分組異或坝茎。下一組的向量將本組向量左移8位再由密文填充空位涤姊。
foreach(byte token in baPlain)
{
QWORD qwEnc = Encrypt(qwIV, qwKey);
QWORD bEnc = (qwEnc >> 56) ^ token;
qwIV = (qwIV << 8) ^ bEnc;
qwlCipher.Add(bEnc);
}
輸出反饋
與CFB相比將加密結(jié)果作為下一組的向量。這里的實現(xiàn)中分組依然為64bit而不是CFB的8bit嗤放。
while (count > 0)
{
qwIV = Encrypt(qwIV, qwKey);
QWORD token = BitConverter.ToUInt64(bsPlain.GetBytes(), (part - count) * 8) ^ qwIV;
qwlCipher.Add(token);
--count;
}
計數(shù)器
和ECB相比將明文變?yōu)橛嫈?shù)器思喊,加解密雙方通過相同的隨機序列發(fā)生器發(fā)生Nonce來輸入加密算法,加密結(jié)果與明文異或產(chǎn)生密文斤吐。由于本程序只有并不是通訊雙方進行加密搔涝,所以未作實現(xiàn)厨喂。
CTR和ECB一樣實現(xiàn)了加密的并行,但安全性要顯然高于ECB庄呈,攻擊者必須要知道隨機序列發(fā)生器的產(chǎn)生序列和密鑰蜕煌。
至此,DES的基本功能就完成了诬留,相對而言還是很簡單的斜纪。下一篇中我們將開始RSA算法的實現(xiàn)。
次回予告:RSA#1 - BigInteger/Prime/PowMod/SteinGCD/ExEuclid
END_OF_PART_3Cry