猿问

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

我在理解这里发生了什么时遇到了一些麻烦。我是加密领域的新手,并试图在通过 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 的问题?我只是不知所措,不想使用这个解决方案。


牛魔王的故事
浏览 537回答 1
1回答

尚方宝剑之说

的实现ICryptoTransform在您调用后不一定可重用TransformFinalBlock(CryptoStream在关闭时自动发生)。CanReuseTransform在创建另一个CryptoStream具有相同转换的属性之前,您应该检查该属性。除了,正如刚刚提到的另一条评论,在某些版本的框架中存在一个错误,其中某些实现不会返回 的正确值CanReuseTransform。为了安全起见,您可能希望每次都重新创建对象。
随时随地看视频慕课网APP
我要回答