为什么8字节明文变成16字节密码?

时间:2014-05-29 23:41:29

标签: c# tripledes

这是一个非常简单的代码。但是我不明白,当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;
    }

enter image description here

1 个答案:

答案 0 :(得分:2)

.NET中TripleDESCryptoServiceProvider的默认填充模式是PKCS7。 PKCS7填充模式根据需要添加尽可能多的字节来填充块,但始终至少有一个字节(!)。这意味着如果您的数据以块边界结束,则需要添加另一个仅包含填充字节的块。

您可以通过明确设置来避免这种情况:

tdsAlg.Padding = PaddingMode.None;

您将设置现在您的密码长度将是预期的8个字节。

即使您的数据与块大小匹配,也需要填充的原因:

想象一下,您的数据以看起来像有效填充字节的字节结尾。在这种情况下,您的消息的解密器将假设这些实际上是填充字节,并且您的消息将缩短。为避免这种情况,在所有情况下都至少添加了一个填充字节。 PKCS7中的填充字节实际上表示填充中的字节数。因此,如果填充消息以0x07结尾,则意味着使用了7个填充字节,并且在解码消息时可以删除它们。