为了账号安全,请及时绑定邮箱和手机立即绑定

AES 加密 - 相同密钥和 IV 的不同加密值

AES 加密 - 相同密钥和 IV 的不同加密值

C#
牛魔王的故事 2021-08-22 14:55:26
我在理解这里发生了什么时遇到了一些麻烦。我是加密领域的新手,并试图在通过 HTTP(以 JSON 字符串发送)传输用户名和密码之前对其进行加密,并在另一端对其进行解密。我有一个类作为 AES 的简单实现(使用硬编码密钥/iv):public class SimpleAES{    private byte[] key = { 32, 128, 16, 11, 28, 36, 45, 15, 214, 184, 17, 244, 27, 142, 252, 119, 111, 84, 125, 244, 123, 93, 126, 39, 44, 76, 87, 118, 231, 136, 43, 109 };    private byte[] vector = { 246, 164, 231, 211, 32, 8, 64, 128, 211, 221, 132, 242, 122, 123, 129, 254 };    private ICryptoTransform encryptor, decryptor;    private UTF8Encoding encoder;    public SimpleAES()    {        //return;        RijndaelManaged rm = new RijndaelManaged();        encryptor = rm.CreateEncryptor(key, vector);        decryptor = rm.CreateDecryptor(key, vector);        encoder = new UTF8Encoding();    }    public string Encrypt(string unencrypted)    {        //return unencrypted;        return Convert.ToBase64String(Encrypt(encoder.GetBytes(unencrypted)));    }    public string Decrypt(string encrypted)    {        //return encrypted;        return encoder.GetString(Decrypt(Convert.FromBase64String(encrypted)));    }    public byte[] Encrypt(byte[] buffer)    {        return Transform(buffer, encryptor);    }    public byte[] Decrypt(byte[] buffer)    {        return Transform(buffer, decryptor);    }    protected byte[] Transform(byte[] buffer, ICryptoTransform transform)    {        MemoryStream stream = new MemoryStream();        using( CryptoStream cs = new CryptoStream(stream, transform, CryptoStreamMode.Write) )        {            cs.Write(buffer, 0, buffer.Length);        }        return stream.ToArray();    }}这会产生正确的加密。SimpleAES在 ASP.NET Core Web API 上的每次加密之间创建一个新对象,什么都不做,并且值保持完全相同。有谁知道为什么这会在 Xamarin.iOS 上以这种方式表现?也许是垃圾收集问题?代码中是否存在特定于 Xamarin.iOS 的问题?我只是不知所措,不想使用这个解决方案。
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

的实现ICryptoTransform在您调用后不一定可重用TransformFinalBlockCryptoStream在关闭时自动发生)。CanReuseTransform在创建另一个CryptoStream具有相同转换的属性之前,您应该检查该属性。

除了,正如刚刚提到的另一条评论,在某些版本的框架中存在一个错误,其中某些实现不会返回 的正确值CanReuseTransform。为了安全起见,您可能希望每次都重新创建对象。


查看完整回答
反对 回复 2021-08-22
  • 1 回答
  • 0 关注
  • 536 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信