Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制生成长度为32字节(16个字符)的初始化向量_C#_Encryption_Initialization Vector_Aescryptoserviceprovider - Fatal编程技术网

C# 强制生成长度为32字节(16个字符)的初始化向量

C# 强制生成长度为32字节(16个字符)的初始化向量,c#,encryption,initialization-vector,aescryptoserviceprovider,C#,Encryption,Initialization Vector,Aescryptoserviceprovider,我想为我的AES加密方法生成一个初始化向量(IV)。我已经将密钥大小定义为256(因为我使用的是AES),所以我的IV需要32字节的长度(256/8)。我希望将IV存储为字符串表示形式,因此使用UTF-8,这相当于一个16个字符的字符串 下面是我用来生成和返回IV using (var aesProv = new AesCryptoServiceProvider()) { aesProv.GenerateIV(); return System.Text.Encoding.Default.

我想为我的AES加密方法生成一个初始化向量(IV)。我已经将密钥大小定义为256(因为我使用的是AES),所以我的IV需要32字节的长度(256/8)。我希望将IV存储为字符串表示形式,因此使用UTF-8,这相当于一个16个字符的字符串

下面是我用来生成和返回IV

using (var aesProv = new AesCryptoServiceProvider())
{
  aesProv.GenerateIV();
  return System.Text.Encoding.Default.GetString(aesProv.IV);
}
如何确保IV的长度为16个字符?因为我使用的是AES库,所以我可以指望生成16个字符的长度吗<代码>加密服务提供商

我希望将IV存储为字符串表示形式,因此使用UTF-8,这相当于一个16个字符的字符串

不,别这样。是的,您可以将32字节解释为UCS-2序列,但这是一个非常糟糕的主意。这不是自然的文本-基本上是任意的二进制数据。由于代理项对等原因,很容易导致UTF-16代码单元序列无效

假设您想要一个能够安全传输的字符串表示形式,我建议只使用base64:

return Convert.ToBase64String(aesProv.IV);
当然,你也可以用十六进制。当然,这两个字符的长度都将大大超过16个字符,但这是适当处理数据的“代价”

我希望将IV存储为字符串表示形式,因此使用UTF-8,这相当于一个16个字符的字符串

不,别这样。是的,您可以将32字节解释为UCS-2序列,但这是一个非常糟糕的主意。这不是自然的文本-基本上是任意的二进制数据。由于代理项对等原因,很容易导致UTF-16代码单元序列无效

假设您想要一个能够安全传输的字符串表示形式,我建议只使用base64:

return Convert.ToBase64String(aesProv.IV);

当然,你也可以用十六进制。当然,这两个字符都比16个字符长得多,但这是正确处理数据的“代价”。

16个字符和UTF-8似乎不是一个很好的匹配,如果您希望存储32个字节(因为每个UTF-8字符可以用1个字节表示)。你可能需要做两个…@Ian:你的意思是不是不是不是所有UTF-8字符都可以用一个字节来表示?@JonSkeet my bad。。。你是对的,不是所有的…“我已经将密钥大小定义为256(因为我使用的是AES),所以我的IV需要32字节的长度”-不。AES有一个128位的固定块大小,这也是IV大小。AES支持不同的密钥大小,这与块大小无关。“32字节(16个字符)”-通常情况下,32个十六进制编码字符可以表示16个任意字节。如果要存储32个字节(因为每个UTF-8字符可以表示为1个字节),16个字符和UTF-8似乎不是很好的匹配。你可能需要做两个…@Ian:你的意思是不是不是不是所有UTF-8字符都可以用一个字节来表示?@JonSkeet my bad。。。你是对的,不是所有的…“我已经将密钥大小定义为256(因为我使用的是AES),所以我的IV需要32字节的长度”-不。AES有一个128位的固定块大小,这也是IV大小。AES支持不同的密钥大小,与块大小无关。“32字节(16个字符)”-通常情况下,32个十六进制编码字符可以表示16个任意字节。感谢您的建议!对我来说,字符串的长度并不重要,只要它转换回32字节,以便在加密/解密过程中使用。@webworm:Right-使用十六进制或base64就可以了。使用base64时,如果要在URL或类似的内容中使用它,您需要稍微小心一点,但它在其他方面非常好。谢谢您的建议!对我来说,字符串的长度并不重要,只要它转换回32字节,以便在加密/解密过程中使用。@webworm:Right-使用十六进制或base64就可以了。使用base64时,如果要在URL或类似的内容中使用它,您需要稍微小心一点,但它在其他方面非常好。