[英]Cannot decrypt data with C# that was encrypted using PHP (Rijdael-128)
I decrypt data using PHP with this code: 我用这段代码用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 and $encrypted is then saved to file and read in the C# sample app: 然后将$ 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));
The output here is exactly the same as the output from PHP, so I can assure there is no encoding error inbetween. 这里的输出与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();
The result of the decryption varies on every program start, even with exactly the same input data: 解密的结果在每个程序启动时都会有所不同,即使输入数据完全相同:
First run: 第一次运行:
DMF1ucDxtqgxw5niaXcmYQ== <-Key DMF1ucDxtqgxw5niaXcmYQ == <-Key
GoCeRkrL/EMKNH/BYeLsqQ== <-IV GoCeRkrL / EMKNH / BYeLsqQ == <-IV
UBE3DkgbJgj1K/TISugLxA== <-Encrypted UBE3DkgbJgj1K / TISugLxA == < - 加密
OlOB99yiCYRDoLx+0xxZxQ== <-"Decrypted" OlOB99yiCYRDoLx + 0xxZxQ == < - “Decrypted”
Second run: 第二轮:
DMF1ucDxtqgxw5niaXcmYQ== <-Key DMF1ucDxtqgxw5niaXcmYQ == <-Key
GoCeRkrL/EMKNH/BYeLsqQ== <-IV GoCeRkrL / EMKNH / BYeLsqQ == <-IV
UBE3DkgbJgj1K/TISugLxA== <-Encrypted UBE3DkgbJgj1K / TISugLxA == < - 加密
w5fcY5Fbb9KRgoHfhqAztA== <-"Decrypted" w5fcY5Fbb9KRgoHfhqAztA == < - “Decrypted”
Key, IV, Encrypted data are identical, but still the decrypted date varies and is always wrong. 密钥,IV,加密数据是相同的,但解密日期仍然不同,总是错误的。 buffer should contain "1234" or "1234" plus 12 trailing zeros. 缓冲区应包含“1234”或“1234”加上12个尾随零。
I don't see why the results vary and what is not working, but I have been staring at this darn piece of code for several hours now, and probably miss the obvious error... 我不明白为什么结果会有所不同,哪些不起作用,但我现在已经盯着这段代码几个小时了,可能会错过明显的错误......
Reversing the CryptoStream like this creates identically wrong results: 像这样反转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));
}
}
Help? 救命? Thanks! 谢谢! Alexander 亚历山大
Well, modifying an old sample of my sins of the past I ended up with this: 好吧,修改过去我的罪过的旧样本我最终得到了这个:
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);
}
}
which gave "1234" with trailing \\0 characters.. Did you just forget to convert the byte[] to a string again? 它给了“1234”尾随\\ 0字符..你是否忘记将字节[]再次转换为字符串? What other difference am I missing? 我还缺少什么其他的区别?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.