【问题标题】:C# Encryption exceptionC# 加密异常
【发布时间】:2010-06-17 19:14:40
【问题描述】:

我的团队,

我在 C# 中有以下加密代码。我收到了Specified initialization vector (IV) does not match the block size for this algorithm. 的例外情况@

你能告诉我这里缺少的链接是什么吗?

//Key and IV for RSA Encryption
byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2");
byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2");

//Read image
Image sourceImg = Image.FromFile(@"D:\ImageSource\Cha1.bmp");

//Convert to Byte[]
byte[] byteArray = ImageToByteArray(sourceImg);

//Encrypt
byte[] encryptedByteArray = EncryptByte(byteArray, ketByte, IVByte);



public static byte[] EncryptByte(byte[] palinData, byte[] Key, byte[] theInitializationVector)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.Security.Cryptography.Rijndael algorithm = System.Security.Cryptography.Rijndael.Create();

            algorithm.Key = Key;
            algorithm.IV = theInitializationVector;  //Exception

            System.Security.Cryptography.CryptoStream cStream = new System.Security.Cryptography.CryptoStream(ms,algorithm.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write);

            cStream.Write(palinData, 0, palinData.Length);
            cStream.Close();

            byte[] encryptedData = ms.ToArray();
            return encryptedData;
        }

谢谢

李乔

【问题讨论】:

标签: c# .net encryption


【解决方案1】:

来自SymmetricAlgorithm.IV Property 文档:

IV 属性的大小必须与BlockSize 属性相同。

还有 BlockSize 属性:

获取或设置加密操作的块大小(以位为单位)。

我不知道“C3CA193570B26E5C3CBB50FD805A01S2”的 UTF-8 编码形式有多少位,但几乎可以肯定它是不正确的(你知道 UTF-8 编码的字符需要多少字节吗?我不知道)。您也不知道 Rijendal 密码的块大小,也不必知道。

您几乎肯定应该改用PasswordDeriveBytes:

PasswordDeriveBytes pdb = 
      new PasswordDeriveBytes("C3CA193570B26E5C3CBB50FD805A01S2", null);

IVByte = pdb.GetBytes(algorithm.BlockSize / 8); //divide by 8 for bits to bytes

最后,从安全的角度来看:Key 是秘密的,而Initialization Vector (IV) 不是。 IV 通常是公开的,与加密数据一起发送。换言之,您的 IV 不应与 Key 相同。

【讨论】:

    【解决方案2】:

    您的初始化向量大小不正确,IV 通常为 16 个字节。

    尝试将向量的大小减半:

    byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C");
    

    【讨论】:

    • 你可能是对的,但他真的应该询问 ciper 对象的块大小,并使用它(在代码中)
    • 而 UTF-8 编码在这里真的没有意义,并不是我责怪你试图给 OP 一个他可以立即理解的答案。
    • 我对加密的了解有限。你能告诉我为什么 UTF-8 编码没有意义吗?我有一个普遍的问题。假设,我像这样编码和加密,万一第二个人可以看到文件的内容(如果他没有密钥)?
    【解决方案3】:

    你期待什么

    byte[] ketByte = Encoding.UTF8.GetBytes("C3CA193570B26E5C3CBB50FD805A01S2");
    byte[] IVByte =  Encoding.UTF8.GetBytes("C3FG563570FG565C3CBB50FD805A01S2");
    

    在做什么?因为他们没有将这些十六进制值加载到字节数组中。他们正在创建一个包含每个字符的 ASCII 值的 32 字节数组。

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多