【问题标题】:Rijndael initialization vector with 16 bytes16 字节的 Rijndael 初始化向量
【发布时间】:2014-04-28 04:08:43
【问题描述】:

我必须将信用卡号加密并作为字符串存储在数据库中。我执行以下操作

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);

这是加密功能:

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;
}

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

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

是否可以生成 16 字节的 IV?提前感谢您的回复

【问题讨论】:

    标签: c# asp.net cryptography rijndael


    【解决方案1】:

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

    string ivString = Convert.ToBase64String(rijMan.IV);
    

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

    byte[] iv = System.Text.Encoding.UTF8.GetBytes(ivString);
    

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

    byte[] iv = Convert.FromBase64String(ivString);
    

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

    【讨论】:

    • 将 IV 与密文一起存储是标准的 - 这不是秘密,并且每条消息都需要不同。
    • @CodesInChaos 好点。我已编辑我的答案以反映您的评论。
    • 我为每个条目生成新的 IV。 RijndaelManaged rijMan = new RijndaelManaged(); byte[] encrypt = Encrypt(txtCredit.Text, rijMan.Key, rijMan.IV);
    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 2011-03-04
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多