【问题标题】:How to decrypt text that was encrypted using RSA in C# [duplicate]如何解密在 C# 中使用 RSA 加密的文本 [重复]
【发布时间】:2013-05-31 06:43:52
【问题描述】:

我需要将代码从 C# 转换为 PHP,结果相同。 在 C# 中我很快就完成了,但现在需要将以下代码转换为 php:

public static string RsaDecrypt(string privateKey, string src)
{
    CspParameters csp = new CspParameters();
    csp.Flags = CspProviderFlags.UseMachineKeyStore;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
    rsa.FromXmlString(privateKey);
    return RsaDecrypt(rsa, src);
}

public static string RsaDecrypt(RSACryptoServiceProvider rsa, string src)
{
    byte[] srcData = Convert.FromBase64String(src);
    byte[] destData = rsa.Decrypt(srcData, false);
    return Encoding.UTF8.GetString(destData);
}

我正在尝试几个小时,但我做不到,我正在使用 phpseclib0.2.1a 文件和代码:

Pastebin

PHP 中的问题是返回以下错误:

注意:第 1582 行 E:\AppServWWW\Request\Flash\Crypt\RSA.php 中的解密错误

@EDIT:我的 $_GET["p"] 是

cwQPQLSW%2FQ70AUmBzkZ9c7d9MrEAcPAAN1lRG937XZuibDOE304i8894uowlC1OANnWEim6suOxzhEHZl0BR1G1audk4CWG1TUSqAo4MO5FBfVbmcLVMx1KPV9%2FeMzil%2BHM1XwyX3Dm0h%2F0uAxORfpa3waq0iOemkUYBq2lXDEU%3D P>

【问题讨论】:

  • 另外,请告诉我们哪一行是1582......
  • if ($lHash != $lHash2) { user_error('解密错误', E_USER_NOTICE);返回假; }
  • 1) 您没有发布加密代码。 2) 将Decrypt 的第二个参数设置为false 意味着您使用了错误的填充。 3) 考虑使用 AES 加密实际数据,仅使用 RSA 加密密钥。 RSA 只能用于加密短数据。

标签: c# php rsa phpseclib


【解决方案1】:

phpseclib 的最新版本是 0.3.1 所以,首先,我建议你升级。

第二... phpseclib 默认进行 OAEP 填充。默认情况下,C# 可能正在执行 PKCS1 填充。所以你需要在 PHP 中进行实际解密之前执行$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

【讨论】:

  • 谢谢,代码运行正常。更新了我的 phpseclib 并添加了您的代码,它有效 =] 非常感谢。
  • 这完全是错误的方式。您应该对两者都使用 OAEP,而不是 PKCS#1v1.5。旧的填充方案存在缺陷,允许填充预言攻击。
猜你喜欢
  • 2019-07-22
  • 2013-03-17
  • 2013-01-02
  • 2011-05-27
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多