【问题标题】:CBC Encryption block size for 128 bit mode128 位模式的 CBC 加密块大小
【发布时间】:2021-05-08 09:25:54
【问题描述】:

我需要使用 128 位 CBC 的 AES 加密字符串

为此我需要将块大小设置为什么?

 var iv = "0000000000000000000000000000000000000000000000000000000000000000".ToByteArray();

 using (Aes myAes = Aes.Create())
 {
     myAes.Mode = CipherMode.CBC;

     // Encrypt the string to an array of bytes.
     byte[] encrypted = EncryptStringToBytes_Aes(xml, myAes.Key, iv);

     // Decrypt the bytes to a string.
     string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, iv);

     //Display the original data and the decrypted data.
     Console.WriteLine("Original:   {0}", xml);
     Console.WriteLine("Round Trip: {0}", roundtrip);
 }

奇怪的是,我的规格似乎不适合 IV

反正我还没有告诉对方 IV 是什么所以我想我必须使用一个 0 的字符串,我认为它有 64 个字符长所以我使用了上面的代码

有人可以帮忙吗?

【问题讨论】:

  • IV是密钥,在ecrypt和decrypt方法上必须使用相同的密钥。密钥不能为空。此外,您不会随消息发送密钥。密钥必须以安全方式在加密位置和解密位置之间发送。发送带有消息的钥匙就像给小偷钥匙一样。
  • ToByteArray() 是扩展方法的糟糕名称,因为它不会告诉读者它如何解释字符串,或者即使它执行常规解码(从十六进制或基数 64)或字符编码(是的,GetBytes 也很糟糕,微软,你从atoi 开始就没有学过)。

标签: c# encryption aes


【解决方案1】:

暂时搁置发送密钥/IV 值或将它们初始化为静态值所带来的所有安全概念...

您的代码似乎来自 Microsoft 的 AES documentation,那么为什么不坚持使用生成的 IV 值呢?

如果您绝对想自己设置 IV(不寒而栗),您需要将其设置为 128 位值或 16 字节。我不知道您的 String.ToByteArray() 代码到底做了什么,但如果我冒险猜测,它可能会使用 UTF8 或 ASCII 等编码将字符串转换为字节。无论哪种情况,您的 IV 数组的长度都将远远超过 16 个字节。只需使用 byte[] iv = new byte[16]; 之类的东西,它将默认将所有插槽初始化为 0。

但是,既然您提到了,我强烈建议您仔细检查密钥/IV 是如何生成或传送给另一方的。

【讨论】:

  • 谢谢 我被告知密钥将被添加到我们的密钥库中,但没有人提到 iv。他们在php中用来解密的代码是decrypted_string=openssl_decrypt($enc_file,"AES-128-CBC",$enc_password);这是没有意义的,因为没有提供 iv
  • IV 是php.net/manual/en/function.openssl-encrypt.php 调用的可选参数。如果未提供,则默认为空字符串。也许你可以尝试匹配它。虽然,这可能是错误的处理方式:“警告:openssl_encrypt():使用空初始化向量 (iv) 可能不安全,不建议在 %d 行的 %s 中使用”这意味着 PHP 会抛出警告级别如果未提供 IV 参数,则会出错。
【解决方案2】:

IV 不是钥匙。 IV 代表初始化向量https://en.wikipedia.org/wiki/Initialization_vector。要生成 IV,您可以使用:https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.aescryptoserviceprovider.generateiv?view=net-5.0

但是您的代码已经生成了 IV 和 KEY。您的代码生成一个 256 位密钥,而您需要一个 128 位密钥。您可以通过添加来实现这一点

myAes.KeySize = 128; 紧跟在Aes.Create() 之后。

所以适用于example 你可能是从以下位置开始的:

string original = "Here is some data to encrypt!";

            // Create a new instance of the Aes
            // class.  This generates a new key and initialization
            // vector (IV).
            using (Aes myAes = Aes.Create())
            {
                myAes.KeySize = 128; //After this line key size will go to 16 bytes.

                // Encrypt the string to an array of bytes.
                byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);

                // Decrypt the bytes to a string.
                string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

                //Display the original data and the decrypted data.
                Console.WriteLine("Original:   {0}", original);
                Console.WriteLine("Round Trip: {0}", roundtrip);
            }

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2019-08-17
    • 2020-04-15
    • 2020-11-29
    • 2021-11-06
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    相关资源
    最近更新 更多