无法在C#bouncycastle和PHP openssl之间交换AES-256-CBC / PKCS7

Shuyi

因此,我在C#和PHP中具有以下代码,到目前为止,结果在双方之间均不一致。对于C#,我正在使用充气城堡API,对于PHP,我正在使用openSSL。可以肯定的是,我还使用Microsoft Crypto Library在C#中对相同的事物进行了加密,并且得到了相同的密文,但是当它们与PHP交换时却没有。

C#

    public const string AES_ALGORITHM = "AES/CBC/PKCS7";
    public const string CRYPTO_ALGORITHM = "AES";
    public AESController(string key) {
        encryptionKey = Convert.FromBase64String(key);
    }
    public string encrypt(string plainText, byte[] iv) {
        string cipherText = "";
        //setting up AES Key
        KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter(CRYPTO_ALGORITHM, encryptionKey);

        // Setting up the Initialization Vector. IV is used for encrypting the first block of input message
        ParametersWithIV aesIVKeyParam = new ParametersWithIV(aesKeyParam, iv);

        // Create the cipher object for AES algorithm using GCM mode and NO padding
        IBufferedCipher cipher = CipherUtilities.GetCipher(AES_ALGORITHM);
        cipher.Init(true, aesIVKeyParam);

        byte[] output = cipher.DoFinal(Encoding.UTF8.GetBytes(plainText));

        cipherText = Convert.ToBase64String(output);
        return cipherText;
    }

    public string decrypt(string cipherText, byte[] iv) {
        string plainText = "";
        //setting up AES Key
        KeyParameter aesKeyParam = ParameterUtilities.CreateKeyParameter(CRYPTO_ALGORITHM, encryptionKey);

        // Setting up the Initialization Vector. IV is used for encrypting the first block of input message
        ParametersWithIV aesIVKeyParam = new ParametersWithIV(aesKeyParam, iv);

        // Create the cipher object for AES algorithm using GCM mode and NO padding
        IBufferedCipher cipher = CipherUtilities.GetCipher(AES_ALGORITHM);
        cipher.Init(false, aesIVKeyParam);


        byte[] output = cipher.DoFinal(Convert.FromBase64String(cipherText));

        plainText = Encoding.UTF8.GetString(output);
        return plainText;
    }

     static void Main(string[] args) {
        AESController aes = new AESController("OXzN4fxHHgcKtAt/SJ4UWtNiQlzno7II1gIBs24CWpY=");
        byte[] iv = Base64.Decode("fdL8sKmhC8YIrYHMzoJJvQ==");
        string encryptedText = "TESTING123";

        string cipherText = aes.encrypt(encryptedText, iv);
        Console.Out.WriteLine("IV: " + Encoding.UTF8.GetString(Base64.Encode(iv)));
        Console.Out.WriteLine("Plain Text:"+aes.decrypt(cipherText, iv));
        Console.Out.WriteLine("Cipher Text:" + cipherText);

        Console.In.ReadLine();
    }

然后是PHP:

    $key = "OXzN4fxHHgcKtAt/SJ4UWtNiQlzno7II1gIBs24CWpY=";
    $iv = base64_decode("fdL8sKmhC8YIrYHMzoJJvQ==");
    //$iv = openssl_random_pseudo_bytes(16);
    //$cipherText = "YMdJ0mdWZ+p50krLzhyI0Q==";
    $plainText = "TESTING123";
    $decrypted = openssl_encrypt($plainText, "aes-256-cbc", $key, 0, $iv);

    var_dump($decrypted);

因此,来自C#bouncycastle的密文为:

EnOtpv4fOGiAKMzXXJMYBA ==

来自PHP的密文为:

Cs + f7a / DBEGma7iQ / PQVLw ==

如果我将c#密文带到PHP,则解密结果为:bool(False)(加密失败)

最后,如果在PHP中,我将填充更改为OPENSSL_ZERO_PADDING,然后从C#解密密文,则结果为:

__XXGmNSlZx。

对于我可以收集到的信息,密钥和IV都相同(都是BASE64字符串),加密的结果具有相同的长度(这在密文末尾解释了两个==。我有什么想念的吗? ,或者我需要对openssl库做一些特别的事情吗?

纳尔夫

与OpenSSL命令行工具不同,PHP的openssl函数期望原始输入,而不是Base64编码的输入。

在您的PHP代码中,您还没有通过Base64解码密钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

来自iOS Swift的PHP AES256 PKCS7解密

来自分类Dev

使用Bouncycastle解密AES-256-CBC

来自分类Dev

使用Bouncycastle解密AES-256-CBC

来自分类Dev

AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

来自分类Dev

通过C中的EVP API的OpenSSL AES 256 CBC

来自分类Dev

错误的加密(QT c++ OpenSSL AES 256 CBC)

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

C# TripleDES CBC/PKCS7/Hex 不等同于 Ruby/Python TripleDES

来自分类Dev

Java使用aes256 / CBC / PKCS7Padding加密文件

来自分类Dev

Java Encrypt a file using aes256/ CBC/PKCS7Padding

来自分类Dev

来自 BouncyCastle 的 AES256-CBC Ciphertext 在 BC 中解密,但 PHP openssl_decrypt 在输入相同的情况下失败

来自分类Dev

无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

来自分类Dev

无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

来自分类Dev

如何使用OpenSSL在PHP中使用AES-256 CBC加密纯文本?

来自分类Dev

如何使用 openssl_public_encrypt 制作 PKCS5 和 PKCS7 填充

来自分类Dev

Flutter / Dart AES-256-CBC从PHP中的加密解密

来自分类Dev

AES-256-CBC 用 PHP 加密并用 Java 解密

来自分类Dev

在tls_rsa_with_aes_256_cbc_sha和tls_rsa_with_aes_128_cbc_sha256之间,哪一个更安全?

来自分类Dev

如何使用OpenSSL加密/解密AES-256 CBC?

来自分类Dev

使用客户端证书和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件

来自分类Dev

C和Java中的输出AES / ECB / PKCS7不相同

来自分类Dev

如何在Dart中使用PKCS5填充密钥生成256-AES CBC密钥

来自分类Dev

AES 256 位 CBC PKCS#5 在 Python 中加密/解密

来自分类Dev

无法使用WolfSSL解析PKCS7证书,但OpenSSL可以解析相同的证书

来自分类Dev

如何使用OpenSSL C库创建退化的PKCS7文件?

来自分类Dev

使用openssl在C中使用PEM证书验证DER格式的PKCS7

来自分类Dev

如何使用Dart解密AES 256 CBC

来自分类Dev

Aes256-CBC编码/解密错误

Related 相关文章

  1. 1

    来自iOS Swift的PHP AES256 PKCS7解密

  2. 2

    使用Bouncycastle解密AES-256-CBC

  3. 3

    使用Bouncycastle解密AES-256-CBC

  4. 4

    AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

  5. 5

    通过C中的EVP API的OpenSSL AES 256 CBC

  6. 6

    错误的加密(QT c++ OpenSSL AES 256 CBC)

  7. 7

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  8. 8

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  9. 9

    C# TripleDES CBC/PKCS7/Hex 不等同于 Ruby/Python TripleDES

  10. 10

    Java使用aes256 / CBC / PKCS7Padding加密文件

  11. 11

    Java Encrypt a file using aes256/ CBC/PKCS7Padding

  12. 12

    来自 BouncyCastle 的 AES256-CBC Ciphertext 在 BC 中解密,但 PHP openssl_decrypt 在输入相同的情况下失败

  13. 13

    无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

  14. 14

    无法解密在服务器端使用OpenSSL AES 256 CBC加密的文件

  15. 15

    如何使用OpenSSL在PHP中使用AES-256 CBC加密纯文本?

  16. 16

    如何使用 openssl_public_encrypt 制作 PKCS5 和 PKCS7 填充

  17. 17

    Flutter / Dart AES-256-CBC从PHP中的加密解密

  18. 18

    AES-256-CBC 用 PHP 加密并用 Java 解密

  19. 19

    在tls_rsa_with_aes_256_cbc_sha和tls_rsa_with_aes_128_cbc_sha256之间,哪一个更安全?

  20. 20

    如何使用OpenSSL加密/解密AES-256 CBC?

  21. 21

    使用客户端证书和TLS_RSA_WITH_AES_256_CBC_SHA256密码套件

  22. 22

    C和Java中的输出AES / ECB / PKCS7不相同

  23. 23

    如何在Dart中使用PKCS5填充密钥生成256-AES CBC密钥

  24. 24

    AES 256 位 CBC PKCS#5 在 Python 中加密/解密

  25. 25

    无法使用WolfSSL解析PKCS7证书,但OpenSSL可以解析相同的证书

  26. 26

    如何使用OpenSSL C库创建退化的PKCS7文件?

  27. 27

    使用openssl在C中使用PEM证书验证DER格式的PKCS7

  28. 28

    如何使用Dart解密AES 256 CBC

  29. 29

    Aes256-CBC编码/解密错误

热门标签

归档