gpt4 book ai didi

c# - 无法使用 C# 解密使用 PHP 加密的数据 (Rijdael-128)

转载 作者:可可西里 更新时间:2023-11-01 13:23:38 29 4
gpt4 key购买 nike

我使用以下代码使用 PHP 解密数据:

$content="1234";
$cp = mcrypt_module_open('rijndael-128', '', 'cbc', '');
$iv = mcrypt_create_iv(16, MCRYPT_RAND);
$key = pack("H*",md5('a'));
mcrypt_generic_init($cp, $key, $iv);
$encrypted = mcrypt_generic($cp, $content);
echo base64_encode($key)."\n";
echo base64_encode($iv)."\n";
echo base64_encode($encrypted)."\n";
mcrypt_generic_deinit($cp);
mcrypt_module_close($cp);

然后将 $iv 和 $encrypted 保存到文件并在 C# 示例应用程序中读取:

var iv=...;
var encrypted=...;
var md5 = new MD5CryptoServiceProvider();
var key = md5.ComputeHash(Encoding.Default.GetBytes("a"));
md5.Clear();

Console.WriteLine(Convert.ToBase64String(key));
Console.WriteLine(Convert.ToBase64String(iv));
Console.WriteLine(Convert.ToBase64String(encrypted));

这里的输出与PHP的输出完全一样,所以我可以保证中间没有编码错误。

var rd = new RijndaelManaged {
Key = key,
IV = iv,
Mode = CipherMode.CBC,
KeySize = 128,
Padding = PaddingMode.Zeros
};

var buffer = new byte[encrypted.Length];
using(var ms = new MemoryStream(buffer)) {
using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Write)) {
cs.Write(encrypted, 0, encrypted.Length);
ms.Read(buffer, 0, buffer.Length);
Console.WriteLine(Encoding.Default.GetString(buffer));
}
}
rd.Clear();

解密的结果在每次程序启动时都不同,即使输入数据完全相同也是如此:

第一次运行:
DMF1ucDxtqgxw5niaXcmYQ== <-键
GoCeRkrL/EMKNH/BYeLsqQ== <-IV
UBE3DkgbJgj1K/TISugLxA== <-已加密
OlOB99yiCYRDoLx+0xxZxQ== <-“解密”

第二次运行:
DMF1ucDxtqgxw5niaXcmYQ== <-键
GoCeRkrL/EMKNH/BYeLsqQ== <-IV
UBE3DkgbJgj1K/TISugLxA== <-已加密
w5fcY5Fbb9KRgoHfhqAztA== <-“解密”

Key, IV, Encrypted data 是相同的,但解密日期仍然不同并且总是错误的。缓冲区应包含“1234”或“1234”加上 12 个尾随零。

我不明白为什么结果会有所不同以及什么不起作用,但我已经盯着这段该死的代码看了好几个小时,可能会错过明显的错误...

像这样反转 CryptoStream 会产生同样错误的结果:

using(var ms = new MemoryStream(encrypted)) {
using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read)) {
cs.Read(buffer, 0, buffer.Length);
Console.WriteLine(Convert.ToBase64String(buffer));
}
}

帮助?谢谢!亚历山大

最佳答案

好吧,修改我过去的罪恶的旧样本,我最终得到了这个:

static string Decrypt() {            
byte[] keyBytes = Convert.FromBase64String("DMF1ucDxtqgxw5niaXcmYQ==");
byte[] iv = Convert.FromBase64String("GoCeRkrL/EMKNH/BYeLsqQ==");
byte[] cipherTextBytes = Convert.FromBase64String("UBE3DkgbJgj1K/TISugLxA==");

var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros};

using (var decryptor = symmetricKey.CreateDecryptor())
using (var ms = new MemoryStream(cipherTextBytes))
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {
var plainTextBytes = new byte[cipherTextBytes.Length];
int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}
}

它给“1234”加上尾随的\0 个字符。您是不是忘记再次将 byte[] 转换为字符串?我还缺少什么其他区别?

关于c# - 无法使用 C# 解密使用 PHP 加密的数据 (Rijdael-128),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2245737/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com