C# 强制生成长度为32字节(16个字符)的初始化向量
我想为我的AES加密方法生成一个初始化向量(IV)。我已经将密钥大小定义为256(因为我使用的是AES),所以我的IV需要32字节的长度(256/8)。我希望将IV存储为字符串表示形式,因此使用UTF-8,这相当于一个16个字符的字符串 下面是我用来生成和返回IVC# 强制生成长度为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.
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或类似的内容中使用它,您需要稍微小心一点,但它在其他方面非常好。