C# 使用RSA解密AES密钥时出现无效密码文本异常

C# 使用RSA解密AES密钥时出现无效密码文本异常,c#,encryption,cryptography,aes,rsa,C#,Encryption,Cryptography,Aes,Rsa,我正在angular 6和.net core api端处理加密/解密请求/响应。我使用AES加密数据,使用RSA公钥加密AES密钥并将其发送到.net核心api。我已经创建了操作筛选器来解密请求,要先解密请求,我必须使用RSA私钥解密AES密钥,但在使用RSA私钥解密AES密钥时,它给了我一个错误: ex{Org.BouncyCastle.Crypto.InvalidCipherTextException:块不正确 位于Org.BouncyCastle.Crypto.Encodings.Pkc

我正在angular 6和.net core api端处理加密/解密请求/响应。我使用AES加密数据,使用RSA公钥加密AES密钥并将其发送到.net核心api。我已经创建了操作筛选器来解密请求,要先解密请求,我必须使用RSA私钥解密AES密钥,但在使用RSA私钥解密AES密钥时,它给了我一个错误:

  • ex{Org.BouncyCastle.Crypto.InvalidCipherTextException:块不正确 位于Org.BouncyCastle.Crypto.Encodings.Pkcs1Encoding.DecodeBlock(字节[]输入,Int32 inOff,Int32 inLen) 在Phyzii.Core.Api.Security.RSA.Decrypt(String cipherText)}System.Exception{Org.BouncyCastle.Crypto.InvalidCipherTextException}
这是我的RSA加密代码:

import JSEncrypt from 'jsencrypt';
encryptObj = new JSEncrypt();
transitionIn(data: any) {
    this.aesSecretKey=this.makeUniqueKey(10);
    console.log(this.aesSecretKey);
    this.data.DATAOBJ = this.aesEncrypt(this.aesSecretKey, data);
    this.encryptObj.setPublicKey(this.publicKeyClient);
    this.data.KEY = this.encryptObj.encrypt(this.aesSecretKey);
    return this.data;
}
private static AsymmetricCipherKeyPair ReadPemFile(string flag)
{
    string filePath = flag == "PUBLIC" ? "D:/Crypto/private_key.pem" : "D:/Crypto/private_key_server.pem";
    AsymmetricCipherKeyPair keys;
    using (var reader = File.OpenText(filePath))// file containing RSA PKCS1 private key
        keys = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
    AsymmetricKeyParameter private_key = keys.Private;
    AsymmetricKeyParameter public_key = keys.Public;
    return keys;
}


//cipherText = "gOItOryuGy0UXHfoNqo0omcXLIOS6dhLJas5zeDNA7MfvsHYwP4ccSWU9JwTrIRiYUq/NB9oRn62ZQ5ynDnsGXUmHfVT4oPxtQZE1fXTTMN5ycfgthegesmXoZMMcWxA/wnwjLAgE17MNaunKY307W+nyc3jEMT1QsWUoOBESo0="
public static string Decrypt(string cipherText) 
{
    try
    {
        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
        AsymmetricCipherKeyPair keys = ReadPemFile("PRIVATE");
        AsymmetricKeyParameter private_key = keys.Private;

        // Pure mathematical RSA implementation
        // RsaEngine eng = new RsaEngine();

        // PKCS1 v1.5 paddings
        // Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine());

        // PKCS1 OAEP paddings
        Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine());
        eng.Init(false, private_key);

        int length = cipherTextBytes.Length;
        int blockSize = eng.GetInputBlockSize();
        List<byte> plainTextBytes = new List<byte>();
        for (int chunkPosition = 0; chunkPosition < length; chunkPosition += blockSize)
        {
            int chunkSize = Math.Min(blockSize, length - chunkPosition);
            plainTextBytes.AddRange(eng.ProcessBlock(cipherTextBytes, chunkPosition, chunkSize));
        }
        return Encoding.UTF8.GetString(plainTextBytes.ToArray());
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
这是我在C端的RSA解密代码:

import JSEncrypt from 'jsencrypt';
encryptObj = new JSEncrypt();
transitionIn(data: any) {
    this.aesSecretKey=this.makeUniqueKey(10);
    console.log(this.aesSecretKey);
    this.data.DATAOBJ = this.aesEncrypt(this.aesSecretKey, data);
    this.encryptObj.setPublicKey(this.publicKeyClient);
    this.data.KEY = this.encryptObj.encrypt(this.aesSecretKey);
    return this.data;
}
private static AsymmetricCipherKeyPair ReadPemFile(string flag)
{
    string filePath = flag == "PUBLIC" ? "D:/Crypto/private_key.pem" : "D:/Crypto/private_key_server.pem";
    AsymmetricCipherKeyPair keys;
    using (var reader = File.OpenText(filePath))// file containing RSA PKCS1 private key
        keys = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
    AsymmetricKeyParameter private_key = keys.Private;
    AsymmetricKeyParameter public_key = keys.Public;
    return keys;
}


//cipherText = "gOItOryuGy0UXHfoNqo0omcXLIOS6dhLJas5zeDNA7MfvsHYwP4ccSWU9JwTrIRiYUq/NB9oRn62ZQ5ynDnsGXUmHfVT4oPxtQZE1fXTTMN5ycfgthegesmXoZMMcWxA/wnwjLAgE17MNaunKY307W+nyc3jEMT1QsWUoOBESo0="
public static string Decrypt(string cipherText) 
{
    try
    {
        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
        AsymmetricCipherKeyPair keys = ReadPemFile("PRIVATE");
        AsymmetricKeyParameter private_key = keys.Private;

        // Pure mathematical RSA implementation
        // RsaEngine eng = new RsaEngine();

        // PKCS1 v1.5 paddings
        // Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine());

        // PKCS1 OAEP paddings
        Pkcs1Encoding eng = new Pkcs1Encoding(new RsaEngine());
        eng.Init(false, private_key);

        int length = cipherTextBytes.Length;
        int blockSize = eng.GetInputBlockSize();
        List<byte> plainTextBytes = new List<byte>();
        for (int chunkPosition = 0; chunkPosition < length; chunkPosition += blockSize)
        {
            int chunkSize = Math.Min(blockSize, length - chunkPosition);
            plainTextBytes.AddRange(eng.ProcessBlock(cipherTextBytes, chunkPosition, chunkSize));
        }
        return Encoding.UTF8.GetString(plainTextBytes.ToArray());
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

然后它将以这种格式解密数据
�����Ŧ���%�钢筋混凝土��\u000e�\b\u0004����我�]&P~�+�뛡�^s�v�ʗ'\b��?合资企业�F�ge\u001b�s���^�\u0002��五/|�vh�}�Z�[A]�}��\u0002u\\�聚丙烯����\u0011k9\u001e\n�E\b�\u0003��\u001a#��}��Y��\u000eTG�U\a�A_KV�\u007fs����?3.���*/*\n\n~�W�Q��'��\a:���Q��BH\u0004R�#C��'D�\u001f���\0 5\u007f���财政司司长�你还需要看到加密。另外,你在传输之前是否将密文转换为base64?我通常建议,如果你试图用一个技术堆栈加密,用另一个技术堆栈解密,你首先在两个堆栈中构建完整的往返过程,并尽可能地分解它,以便你可以在尽可能多的时间比较这两个堆栈的输出尽可能分为两个阶段。一旦两个堆栈都有了往返,并且它们对数据所走的路程完全一致,那么在中途交换一个就容易多了。我在angular中使用JSEncrypt来使用RSA加密数据。我在c#端将其转换为base64,您可以在我的代码中检查它@kelalaka@kelalaka看,现在我已经在angular Side使用RSA encryption更新了答案我无法重现此问题。使用JSEncrypt(3.0.0-rc.1,没有angular)进行加密,使用C#进行解密(.NET Core 2.2,您的代码)工作。你确定你的公钥和私钥是兼容的吗,即解密在角度方面有效吗?你使用哪个JSEncrypt版本?我的建议是:创建一个测试RSA密钥对,并将私钥和公钥发布为PEM,以及一个要加密的测试AES密钥(使用它的方式是原始的或编码的),和(其中之一)使用JSEncrypt生成的密文。