Rijndael初始化向量,16字节

Som*_*ser 1 c# asp.net cryptography rijndael

我必须将信用卡号加密并作为字符串存储在数据库中.我做了以下事情

RijndaelManaged rijMan = new RijndaelManaged();
byte[] encrypt = Encrypt(txtCredit.Text, rijMan.Key, rijMan.IV);
string card = Convert.ToBase64String(encrypt);
string key = Convert.ToBase64String(rijMan.Key);
string iv = Convert.ToBase64String(rijMan.IV);
Run Code Online (Sandbox Code Playgroud)

这是加密功能:

public static byte[] Encrypt(string message, byte[] key, byte[] iv)
{
    byte[] encrypted;
    using (RijndaelManaged rijMan = new RijndaelManaged())
    {
        rijMan.Key = key;
        rijMan.IV = iv;
        ICryptoTransform encrypt = rijMan.CreateEncryptor(rijMan.Key, rijMan.IV);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
            {
                using (StreamWriter sw = new StreamWriter(cs))
                {
                    sw.Write(message);
                }
                encrypted = ms.ToArray();
            }
        }
    }
    return encrypted;
}
Run Code Online (Sandbox Code Playgroud)

我将它们全部存储在数据库中.这似乎很好.但是当我从数据库中检索字符串并使用System.Text.Encoding.UTF8.GetBytes(string)转换为时byte,它会抛出异常

指定的初始化向量(IV)与此算法的块大小不匹配.

是否可以生成IV,使其为16字节?在此先感谢您的回复

jar*_*riq 5

在帖子的顶部,您使用BASE64算法将IV字节转换为字符串

string ivString = Convert.ToBase64String(rijMan.IV);
Run Code Online (Sandbox Code Playgroud)

然后在帖子的底部,您使用UTF8编码将字符串读入字节数组

byte[] iv = System.Text.Encoding.UTF8.GetBytes(ivString);
Run Code Online (Sandbox Code Playgroud)

但是你应该再次使用BASE64算法:

byte[] iv = Convert.FromBase64String(ivString);
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我希望你不要将AES密钥(rijMan.Key)存储在与加密信用卡号相同的数据库中,因为这会使整个加密完全无用.

  • 将IV与密文一起存储是标准的 - 它并不是秘密,需要针对每条消息进行不同的处理. (3认同)