请注意,我在这里遇到的问题是密钥 size 。首先,基于下面代码中包含的注释,我认为我的密钥需要是24字节(192位)。这不起作用所以我给了16,32和8字节键一个镜头 - 似乎没有任何工作。通过“不工作”,我的意思是在我的文本加密和解密后,它与原始文本的值不同。
原文: 'Example test this should work '
加密文字:¸¹pÕô6
解密文字: 'Example '
以下是我正在使用的两个功能(加密/解密功能)。此外,我将包括我如何调用每个函数。
// 168-bit (three-key) 3DES (Triple-DES) encrypt a single 8-byte block (ECB mode)
// plain-text should be 8-bytes, key should be 24 bytes.
public byte[] TripleDesEncryptOneBlock(byte[] plainText, byte[] key)
{
// Create a new 3DES key.
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
// Set the KeySize = 192 for 168-bit DES encryption.
// The msb of each byte is a parity bit, so the key length is actually 168 bits.
des.KeySize = 192;
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
ICryptoTransform ic = des.CreateEncryptor();
byte[] enc = ic.TransformFinalBlock(plainText, 0, 8);
return enc;
}
public byte[] TripleDesDecryptBlock(byte[] plainText, byte[] key)
{
// Create a new 3DES key.
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
// Set the KeySize = 192 for 168-bit DES encryption.
// The msb of each byte is a parity bit, so the key length is actually 168 bits.
des.KeySize = 192;
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.None;
ICryptoTransform ic = des.CreateDecryptor();
byte[] dec = ic.TransformFinalBlock(plainText, 0, 8);
return dec;
}
// Encrypt Text
textBox5.Text = ByteToString(TripleDesEncryptOneBlock(StringToByte(textBox5.Text), StringToByte("1 2 3 4 5 6 7 8 9 1 1 2 ")));
// Decrypt Text
textBox5.Text = ByteToString(TripleDesDecryptBlock(StringToByte(textBox5.Text), StringToByte("1 2 3 4 5 6 7 8 9 1 1 2 ")));
感谢您的帮助,
埃文
答案 0 :(得分:2)
线索在您正在使用的功能名称中:TripleDesEncryptOneBlock
此方法仅加密输入字符串的一个块(8个字节或64位)。要加密整个字符串,您需要将多个调用链接到此方法。
答案 1 :(得分:2)
使用此:
byte[] enc = ic.TransformFinalBlock(plainText, 0, plainText.Length);
我希望它会加密/解密你的整个字符串。此外,您不需要多次调用此方法
答案 2 :(得分:0)
您的问题在这里:
byte[] dec = ic.TransformFinalBlock(plainText, 0, 8);
^
您只对数组的前8个字符进行编码,因此,在解码时,只有这8个字符需要解码,结果为'Example '
。
如果要对所有文本进行编码,则必须增加该值。但是要小心,如果使用PaddingMode.None
,如果要编码的数组的长度不是8的倍数,它将失败。
我在文本中添加了一些填充,如下所示:
int length = plainText.Length / 8;
if(plainText.Length%8 > 0)
{
length++;
}
byte[] paddedText = new byte[length * 8];
plainText.CopyTo(paddedText, 0);
byte[] enc = ic.TransformFinalBlock(paddedText, 0, length * 8);