这是一个非常简单的代码。但是我不明白,当Blocksize
是8byte时,密码大小是16bytes,为什么呢?我希望它与Blocksize
相同。从简单的思考,我给出64位作为明文,并期望有64位作为密码。我真的没有理由在这里做任何填充。似乎在每8字节(Blocksize
)之后,密码变为8字节。 16bytes Block变为24bytes Cipher等。为什么会这样?我真的很想知道。
只是出于好奇,有没有可能/方法从8bytes Block获得8bytes Cipher?
3DES代码:(仅限加密部分)
static void Main(string[] args)
{
Console.WriteLine("Enter Plain Text: ");
string original =Console.ReadLine();
TripleDESCryptoServiceProvider myTripleDES = new TripleDESCryptoServiceProvider();
byte[] encrypted = EncryptStringToBytes(original,myTripleDES.Key, myTripleDES.IV);
string encrypt = Convert.ToBase64String(encrypted);
string decrypted = DecryptStringFromBytes(encrypted,myTripleDES.Key, myTripleDES.IV);
Console.WriteLine("encryted: " +encrypt);
Console.WriteLine("decrypted: " +decrypted);
Console.ReadLine();
}
static byte[] EncryptStringToBytes(string plainText, byte[] Key, byte[] IV)
{
byte [] data= Encoding.UTF8.GetBytes(plainText);
Console.WriteLine("The Block length: " +data.Length);
TripleDESCryptoServiceProvider tdsAlg = new TripleDESCryptoServiceProvider();
tdsAlg.BlockSize = 64;
tdsAlg.KeySize = 128;
tdsAlg.Key = Key;
tdsAlg.IV = IV;
ICryptoTransform encryptor = tdsAlg.CreateEncryptor(tdsAlg.Key, tdsAlg.IV);
byte[] encrypted = encryptor.TransformFinalBlock(data, 0, data.Length);
Console.WriteLine("The Cipher length: " + encrypted.Length);
return encrypted;
}
答案 0 :(得分:2)
.NET中TripleDESCryptoServiceProvider
的默认填充模式是PKCS7。 PKCS7填充模式根据需要添加尽可能多的字节来填充块,但始终至少有一个字节(!)。这意味着如果您的数据以块边界结束,则需要添加另一个仅包含填充字节的块。
您可以通过明确设置来避免这种情况:
tdsAlg.Padding = PaddingMode.None;
您将设置现在您的密码长度将是预期的8个字节。
即使您的数据与块大小匹配,也需要填充的原因:
想象一下,您的数据以看起来像有效填充字节的字节结尾。在这种情况下,您的消息的解密器将假设这些实际上是填充字节,并且您的消息将缩短。为避免这种情况,在所有情况下都至少添加了一个填充字节。 PKCS7中的填充字节实际上表示填充中的字节数。因此,如果填充消息以0x07结尾,则意味着使用了7个填充字节,并且在解码消息时可以删除它们。