繁体   English   中英

在C#中解密Crypto ++ RSA密文会导致异常

[英]Decrypting Crypto++ RSA cipher text in C# causes exception

我已经使用Crypto ++在C ++中编写了3个函数来生成密钥对,加密和解密字符串。 加密++方面

//Decode public key
RSA::PublicKey pbKeyDecoded;
StringSource ss2(publicKey, true, new Base64Decoder);
pbKeyDecoded.BERDecode(ss2);

Integer m = Integer((const byte*)plaintext.data(), plaintext.size());
Integer crypted = pbKeyDecoded.ApplyFunction(m);
...

我要做的是生成密钥,对它进行DER编码,然后将其编码为Base64。 之后,我将通过公用密钥对明文进行加密,然后将私钥和加密均作为base64编码的字符串保存在两个单独的文件中。

现在到C#。 我正在读取base64字符串,对其进行解码并通过AsnParser加载它们,看起来似乎加载得很好。 然后我打电话给Decrypt C#端

AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der");
RSAParameters publicKey = keyParser.ParseRSAPublicKey();

CspParameters csp = new CspParameters;
csp.KeyContainerName = "RSA Test (OK to Delete)";    
csp.ProviderType = PROV_RSA_FULL;    // 1
csp.KeyNumber = AT_KEYEXCHANGE;      // 1

RSACryptoServiceProvider rsp = new RSACryptoServiceProvider(csp);
rsp.PersistKeyInCsp = false;
rsp.ImportParameters(privateKey);

//Causes exception here..
var data = rsp.Decrypt(cipherArr, true);
...

但是,当我尝试使用fOAEP = true解密它时, fOAEP = true异常错误: CryptographicException:解码OAEP填充时发生错误。 如果我传递的fOAEP = false则会得到CryptographicException:该参数不正确。

为什么在尝试解密Crypto ++密文时C#中出现异常?

...当我尝试对其解密时,出现异常错误:CryptographicException:解码OAEP填充时发生错误。 那就是如果我为fOAEP bool传递true,如果我传递false则得到CryptographicException:参数不正确。

您遇到与在Crypto ++中使用原始RSA算法加密和解密消息相同的问题吗? 以及如何将Crypto ++ RSA与C#RSA加密服务提供商同步? “原始RSA”计划必须是我们月份。

在等式的Crypto ++方面, 您正在执行原始RSA 您只是在应用转发功能(即幂运算),而未格式化消息:

//Decode public key
RSA::PublicKey pbKeyDecoded;
StringSource ss2(publicKey, true, new Base64Decoder);
pbKeyDecoded.BERDecode(ss2);

Integer m = Integer((const byte*)plaintext.data(), plaintext.size());
Integer crypted = pbKeyDecoded.ApplyFunction(m);
...

在C#方面, 您正在使用PKCS#1.5填充或OAEP填充使用PKCS#1 执行RSA解密

RSACryptoServiceProvider rsp = new RSACryptoServiceProvider(csp);
rsp.PersistKeyInCsp = false;
rsp.ImportParameters(privateKey);

//Causes exception here..
var data = rsp.Decrypt(cipherArr, true);

我不清楚您的代码的C#版本是否可以执行OAEP填充,因为它需要特定版本的CLR。 您可能只有PKCS填充可用。


我相信您有两种选择。 首先,您可以在Crypto ++中使用标准的RSA加密方法。 Crypto ++ Wiki在RSA密码学RSA加密方案中列出了它们:

typedef RSAES<PKCS1v15>::Decryptor RSAES_PKCS1v15_Decryptor;
typedef RSAES<PKCS1v15>::Encryptor RSAES_PKCS1v15_Encryptor;

typedef RSAES<OAEP<SHA> >::Decryptor RSAES_OAEP_SHA_Decryptor;
typedef RSAES<OAEP<SHA> >::Encryptor RSAES_OAEP_SHA_Encryptor;

其次,您需要在C#中执行Raw RSA。 要在C#中执行Raw RSA,您将需要获取BigInteger类并手动应用逆函数。

我鼓励您将RSA加密与OAEP填充一起使用。 如果OAEP不可用,则第二个选择是PKCS填充。 最后,如果您所拥有的只是Raw RSA,那么我会寻找另一个加密系统,因为Raw RSA是如此不安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM