[英]Decrypting a string encrypted by PHP with AES256-GCM using OpenSSL in C# using BouncyCastle
[英]Encoding problem in C# decrypting in bouncycastle from openssl
我正在嘗試使用 bouncycastle 在 c# 中解密,這是以下 php 代碼的結果:
<?php
$plaintext = 'The quick brown fox jumps over the lazy dog';
$cipher = "AES-128-CTR";
$key = "F5UgsDQddWGdgjddJtNgg6xE3V9uwaCR";
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = '2782614358578542';
$ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
echo $ciphertext."\n";
}
?>
我的c#代碼如下:
public string Decrypt(string toDecrypt, string keyStr, string ivStr)
{
byte[] inputBytes = Convert.FromBase64String(toDecrypt);
byte[] keyBytes = Encoding.UTF8.GetBytes(keyStr);
byte[] iv = Encoding.UTF8.GetBytes(ivStr);
IBufferedCipher cipher = CipherUtilities.GetCipher("AES/CTR/PKCS7PADDING");
cipher.Init(false, new ParametersWithIV(ParameterUtilities.CreateKeyParameter("AES", keyBytes), iv));
byte[] decryptedBytes = cipher.DoFinal(inputBytes);
return Encoding.UTF8.GetString(decryptedBytes);
}
php代碼返回
7/q61uOzeC4iycFIMrjvh01zvjOuCtnX8eWob8MAA5kIfMOIx915ctBIyw==
但是當我在 C# 中進行以下調用時
Decrypt("7/q61uOzeC4iycFIMrjvh01zvjOuCtnX8eWob8MAA5kIfMOIx915ctBIyw==", "F5UgsDQddWGdgjddJtNgg6xE3V9uwaCR", "2782614358578542");
我得到以下胡言亂語:
���yF�l����c:�-��7K�(�,�X�.[�W"�ܜ��J�
這讓我覺得我錯過了編碼或做錯了編碼,但我似乎無法弄清楚。
AES-128 使用 16 字節的密鑰。 然而,在 PHP 代碼中,使用了一個 32 字節的密鑰,PHP 通過只考慮前 16 個字節來隱式截斷該密鑰。
所以解決方法是相應地縮短 C# 代碼中的密鑰,即使用F5UgsDQddWGdgjdd
。
或者,將 PHP 代碼中的 AES 變體更改為 AES-256 ( aes-256-ctr
),從而生成密文Tw05j9QDfaBK7zbyt9jine8xWqnzNB2Pim7rtv7gDba2TsE7ejvvjP5YKA==
。
此外,在 C# 代碼中,應用AES/CTR/NoPadding
,因為 CTR 是一種不需要填充的流密碼模式,這就是為什么在 PHP 代碼中隱式禁用填充的原因。
請注意,出於安全原因,密鑰/IV 對不得重復使用,尤其是對於 CTR。 因此,對於固定密鑰,不能應用靜態IV,而是隨機IV(與密文一起傳遞給解密方,通常是連接的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.