簡體   English   中英

從openssl在bouncycastle中解密的C#中的編碼問題

[英]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.

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