我在理解这里发生了什么时遇到了一些麻烦。我是加密领域的新手,并试图在通过 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
在您调用后不一定可重用TransformFinalBlock
(CryptoStream
在关闭时自动发生)。CanReuseTransform
在创建另一个CryptoStream
具有相同转换的属性之前,您应该检查该属性。
除了,正如刚刚提到的另一条评论,在某些版本的框架中存在一个错误,其中某些实现不会返回 的正确值CanReuseTransform
。为了安全起见,您可能希望每次都重新创建对象。
- 1 回答
- 0 关注
- 536 浏览
添加回答
举报
0/150
提交
取消