【问题标题】:Encrypting and then decrypting doesn't yield the same plaintext for AES加密然后解密不会为 AES 产生相同的明文
【发布时间】:2015-01-17 23:49:02
【问题描述】:

我想使用 AES 算法来加密一些文件。 这是我创建随机密钥的代码:

public byte[] CreateRandomKey()
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 128;
    aes.GenerateKey();
    return aes.Key;
}

首先我想知道的是,GenerateKey() 方法是否“足够随机”以确保安全?

这是我的加密和解密代码:

public byte[] Encrypt(byte[] key, byte[] input)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 128;
    aes.Key = key;

    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write);
    cs.Write(input, 0, input.Length);
    cs.Close();
    return ms.ToArray();
}

public byte[] Decrypt(byte[] key, byte[] input)
{
    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 128;
    aes.Key = key;

    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
    cs.Write(input, 0, input.Length);
    cs.Close();
    return ms.ToArray();
}

我想知道没有初始化向量的算法是否安全? 而且我的算法有问题,如果我加密一些字节并解密加密的结果,结果与原始字节不同。 我希望这对于一个问题来说并不算多,有人可以帮助我。

【问题讨论】:

  • 您应该关注每个帖子的一个问题。对我来说,感觉“不工作”应该是您首先关心的问题。如果你能展示一个简短但完整的程序来说明问题,那将真的很有帮助。

标签: .net encryption cryptography aes


【解决方案1】:

是的,密钥生成应该是安全的。操作系统可能拥有对加密安全随机数生成器的最佳访问权限。这当然不是完整的安全审查。

正在使用随机 IV,因为 .NET 会自动为您生成一个。问题是您没有将该 IV 传达给解密功能。这就是密文前16字节解密失败的原因。

【讨论】:

  • 感谢您的出色回答,将 IV 解密后的字节设置为加密!
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多