簡體   English   中英

無法使用PHP(Rijdael-128)加密的C#解密數據

[英]Cannot decrypt data with C# that was encrypted using PHP (Rijdael-128)

我用這段代碼用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 == <-Key
GoCeRkrL / EMKNH / BYeLsqQ == <-IV
UBE3DkgbJgj1K / TISugLxA == < - 加密
OlOB99yiCYRDoLx + 0xxZxQ == < - “Decrypted”

第二輪:
DMF1ucDxtqgxw5niaXcmYQ == <-Key
GoCeRkrL / EMKNH / BYeLsqQ == <-IV
UBE3DkgbJgj1K / TISugLxA == < - 加密
w5fcY5Fbb9KRgoHfhqAztA == < - “Decrypted”

密鑰,IV,加密數據是相同的,但解密日期仍然不同,總是錯誤的。 緩沖區應包含“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字符..你是否忘記將字節[]再次轉換為字符串? 我還缺少什么其他的區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM