C# RSA 加密 -> PHP RSA 解密

2023-12-13

我正在尝试在 C# 中使用 RSA 加密 AES 密钥和 IV,并使用 phpseclib 使用 PHP 解密它们。我花了大约 4 个小时尝试解决这个问题,但总是收到“第 2495 行解密错误”。 PKCS 似乎有问题。

临时私钥

<?php define("RSA_Private", "-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP9wTdAh+f0Ndi55R4qBcrAIUv 1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET/DiwwTP/+YPEJYenU2Zbfirb 2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8auNNzp22QVIH19tDlwIDAQAB AoGAV62wD84pZW8YjYHiK9v3GHYCtqOKuY41z2tOwXGU61u/dNxCO9U4Xyrs1d57 zokPXFImO7y/tupmLVQuy4N8rgO0BqB2t3YETpOlwmOF4CYl0Lkoa5mlQ1XvBXoU qbNU33UlJUNheLT0UM7lhwwnBTqNlfC1/bNXL8TYCsyt+KECQQDstdKRaip8YH20 DgB2301/91pCTAkw/vXEPi8GBVq4EN/hWSwpz+hDrJrbmSBnTkQ2IlWvYy3nghGB g/QwTaZ/AkEAzriR/Snqfif2fpSovp0ln8/A0AR0utq1FfvYWMkT9woqPR5iJjS7 ZcVX1U9ayC4fPypMz/BXafy9MGstllhG6QJAakZ387GmwZDQ3zYqHzTCpuF3NKzO s6DE1wbUNe/RezKYUaSnn14o+blVDaMCWV9aYLOppMTypy5Ojcegqs8yIQJADXjL 0tLbfFNAZilsAdgd7pdMeoH/1XmRWZhrFgYsrenUrN0BCnpfSBefTMB6KxeOY8Bu 9xIzsC2PasthUi34mQJAV5IvcjaOiMSed28LegOHTBXP5Qpu96GQGneD3x92AtM+ aRhEjMeoadetA0JQcPRJgVXTov5wir5xeCEUjpplGg== -----END RSA PRIVATE KEY-----");?>

临时公钥

<?php define("RSA_Public", "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP 9wTdAh+f0Ndi55R4qBcrAIUv1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET /DiwwTP/+YPEJYenU2Zbfirb2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8 auNNzp22QVIH19tDlwIDAQAB -----END PUBLIC KEY-----");?>

C#中RSA加密后的密文(解密=“testkey”因为我删除了aes加密进行测试)

Cd/RsiVqKnEP2T9oTgnvRuHVKY09VfynLHIlinIGtW4PFrB2kKffIrIqRQKhob6bPIR4efjxhCn43AQ2gE5P/AMG/EDWk9HMJF8XuhdtsWfPmnqxVV4crpA2FZwh4BWdXq4N70ieWbuk+pRJ1dHGhLgFfphp4sVVopn3bPKw2VKI0O+MT4nUCHFac25owoFnMULzuxj60I9Qa/TIlCKwMNcv2r7ili/LvplPZIEnH2p/bR62TAUvty0yo9NTHZm+wlqyIUmA1/GrM0VHjmcnRjFQHp1zQreRspvRsbk=

PHP(无论是否 strrev 都没有变化):

public function RSADecryption($key, $iv) {
    $PrivateKeyFile = RSA_Private;
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $rsa->loadKey($PrivateKeyFile);
    // decrypt key and iv for aes decryption
    $aes_key = base64_encode($rsa->decrypt(strrev((base64_decode($key)))));
    $aes_iv = base64_encode($rsa->decrypt(base64_decode($iv)));
    echo $aes_key;
    echo "<br />";
    echo $aes_iv;
}

C# 加密:

public static string RSAEncryption(string aes_key, string aes_iv, string publickey)
    {
        if (publickey.Contains("-----"))
        {
            // Get public key without -----....
            publickey = publickey.Split(new string[] { "-----" }, StringSplitOptions.RemoveEmptyEntries)[1];
        }

        // Remove "new line" characters
        publickey.Replace("\n", "");
        byte[] KeyToEncrypt = Encoding.Default.GetBytes(aes_key);
        byte[] IVToEncrypt = Encoding.Default.GetBytes(aes_iv);
        byte[] PublicKey = Encoding.Default.GetBytes(publickey);

        //Values to store encrypted symmetric keys.
        byte[] EncryptedKey;
        byte[] EncryptedIV;

        //Create a new instance of RSACryptoServiceProvider.
        RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

        //Get an instance of RSAParameters from ExportParameters function.
        RSAParameters RSAKeyInfo = RSA.ExportParameters(false);

        //Set RSAKeyInfo to the public key values.
        RSAKeyInfo.Modulus = PublicKey;
        //Import key parameters into RSA.
        RSA.ImportParameters(RSAKeyInfo);

        //Encrypt the symmetric key and IV.
        EncryptedKey = RSA.Encrypt(KeyToEncrypt, false);
        EncryptedIV = RSA.Encrypt(IVToEncrypt, false);
        System.IO.File.WriteAllText(@"C:\WriteTextCryptKey.txt", Convert.ToBase64String(EncryptedKey));
        System.IO.File.WriteAllText(@"C:\WriteTextCryptIV.txt", Convert.ToBase64String(EncryptedIV));
        return Convert.ToBase64String(EncryptedKey);
    }

phpseclib 中调用函数:

function _rsaes_pkcs1_v1_5_decrypt($c)
{
    // Length checking

    if (strlen($c) != $this->k) { // or if k < 11
        user_error('Decryption error');
        return false;
    }

    // RSA decryption

    $c = $this->_os2ip($c);
    $m = $this->_rsadp($c);

    if ($m === false) {
        user_error('Decryption error');
        return false;
    }
    $em = $this->_i2osp($m, $this->k);

    // EME-PKCS1-v1_5 decoding

    if (ord($em[0]) != 0 || ord($em[1]) > 2) {
        user_error('Decryption error');
        return false;
    }

    $ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
    $m = substr($em, strlen($ps) + 3);

    if (strlen($ps) < 8) {
        user_error('Decryption error');
        return false;
    }

    // Output M

    return $m;
}

if (ord($em[0]) != 0 || ord($em[1]) > 2)是第 2495 行


解决方案:

C#:

public static string RSAEncryption(string aes_key, string aes_iv)
    {
        //encode key and iv to byte array
        byte[] KeyToEncrypt = Encoding.Default.GetBytes(aes_key);
        byte[] IVToEncrypt = Encoding.Default.GetBytes(aes_iv);

        //get RSA public key from xml file
        TextReader reader = new StreamReader("publicKey.xml");
        string publicKey = reader.ReadToEnd();
        reader.Close();
        MessageBox.Show(publicKey);

        //Values to store encrypted symmetric keys.
        byte[] EncryptedKey;
        byte[] EncryptedIV;

        //Create a new instance of RSACryptoServiceProvider.
        RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

        //set xml string as public key
        RSA.FromXmlString(publicKey);

        //Encrypt the symmetric key and IV.
        EncryptedKey = RSA.Encrypt(KeyToEncrypt, false);
        EncryptedIV = RSA.Encrypt(IVToEncrypt, false);
        System.IO.File.WriteAllText(@"C:\WriteTextCryptKey.txt", Convert.ToBase64String(EncryptedKey));
        System.IO.File.WriteAllText(@"C:\WriteTextCryptIV.txt", Convert.ToBase64String(EncryptedIV));
        return Convert.ToBase64String(EncryptedKey);
    }

PHP:

public function RSADecryption($key, $iv) {
    $PrivateKeyFile = RSA_Private;
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $rsa->loadKey($PrivateKeyFile); //private key in xml
    // decrypt key and iv for aes decryption
    $aes_key = $rsa->decrypt(base64_decode($key));
    $aes_iv = $rsa->decrypt(base64_decode($iv));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# RSA 加密 -> PHP RSA 解密 的相关文章

  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 按时间戳字段中的日期过滤结果

    我已经获得了一些帮助 但不确定为什么这不起作用 我正在尝试使用表单让用户过滤他们的活动 存储在数据库中 My code GET from 01 11 2013 GET to 25 11 2013 from DateTime createFr
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 尝试使用curl进行GET,发送的值允许为空

    我正在尝试使用curl 来执行一个简单的GET 其中包含一个名为redirect uri 的参数 被调用的 php 文件打印出 GET redirect uri 的空字符串 它显示 red 并且似乎没有发送任何内容 执行获取操作的代码 Ge
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • CKEditor TypeError:c[a] 在 CodeIgniter 中未定义

    我正在尝试在基于 codeigniter 的网站中安装 CKEditor 并且我已按照本教程进行操作 Codeigniter 教程中的 CKEditor http nukium com developpement php framework
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t
  • PDO 返回不正确但重复的数据。密钥不在数据库中。

    我刚开始使用 pdo 语句 所以可能是一些简单的东西 我还没有在 php net 上读过 查询数据库时我收到重复的结果 Result 0 gt Array umeta id gt 31 0 gt 31 user id gt 2 1 gt 2

随机推荐