炫意html5
最早CSS3和HTML5移动技术网站之一

遭遇奇怪的 .NET 在 Linux 上的 AES 加密问题

遇到一个很奇怪的问题,用 C# 写的 AES CBC 128 位加密代码,在 linux 上的加密结果,不管用 C# 还是 PHP,解密出来的开头几个字符总是会乱码

.ug6'<'3;71dek`7667463c836a535b40d6b839","user_year":13,"ad":"vth"}

而同样的代码在 windows 上运行得到的加密结果,不管用 C# 还是 PHP,不管是在 windows 还是 linux 上都能正常解密

{"uid":"096e3e957667463c836a535b40d6b839","user_year":13,"ad":"vth"}

.NET 5.0 与 .NET 6 都是同样的问题。

.NET 6 的 C# 加密代码:

var aes = Aes.Create();
aes.Key = Encoding.ASCII.GetBytes(KEY);
ReadOnlySpan<byte> ivBytes = Encoding.ASCII.GetBytes(IV);
ReadOnlySpan<byte> plainTextBytes = Encoding.ASCII.GetBytes(plainText);
var cipherTextBytes = aes.EncryptCbc(plainTextBytes, ivBytes);
return Convert.ToBase64String(cipherTextBytes);

.NET 5.0 的 C# 加密代码:

var aes = Aes.Create();
aes.Mode = CipherMode.CBC;
aes.Key = Encoding.ASCII.GetBytes(KEY);
aes.IV = Encoding.ASCII.GetBytes(IV);
using var memoryStream = new MemoryStream();
using var aesEncryptor = aes.CreateEncryptor();
CryptoStream cryptoStream = new(memoryStream, aesEncryptor, CryptoStreamMode.Write);
byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] cipherBytes = memoryStream.ToArray();
return Convert.ToBase64String(cipherBytes);

回答

问题补充:

PHP 解密代码

$method = 'aes-128-cbc';
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);

C# 解密代码

using var aes = Aes.Create();
aes.Key = Encoding.ASCII.GetBytes(KEY);
ReadOnlySpan<byte> ivBytes = Encoding.ASCII.GetBytes(IV);
var decryptedBytes = aes.DecryptCbc(cipherTextBytes, ivBytes);
var decryptedText = Encoding.UTF8.GetString(decryptedBytes);

炫意HTML5 » 遭遇奇怪的 .NET 在 Linux 上的 AES 加密问题

Java基础教程Android基础教程