C# RSA加密与PHP解密跨平台实现指南

admin 百科 12

C# RSA加密与PHP解密跨平台实现指南

本教程详细阐述了如何在c#应用程序中实现rsa数据加密,并使用php进行解密的跨平台方案。核心挑战在于c#默认输出的rsa密钥为xml格式,而php的openssl函数要求pem格式。文章将指导您完成c#加密代码的编写、密钥的导出与转换,以及php中利用openssl函数进行数据解密的完整过程,确保跨语言环境下的安全通信。

在现代应用开发中,跨平台数据加密与解密是保障数据安全的重要环节。RSA作为一种非对称加密算法,广泛应用于数据传输和身份验证。本教程将专注于解决一个常见场景:在C#环境中对数据进行RSA加密,然后在PHP环境中利用私钥对这些数据进行解密。此过程的关键在于处理C#导出的XML格式密钥与PHP OpenSSL函数所需的PEM格式密钥之间的兼容性问题。

C# RSA加密实现

在C#中,我们可以利用System.Security.Cryptography.RSACryptoServiceProvider类来生成RSA密钥对并执行加密操作。以下是一个用于RSA加密的C#类示例:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml.Serialization;

namespace TEST
{
    public class RSAEncrypter
    {
        private RSACryptoServiceProvider _rsa;
        private RSAParameters _privateKey;
        private RSAParameters _publicKey;

        /// <summary>
        /// 构造函数,生成2048位的RSA密钥对。
        /// </summary>
        public RSAEncrypter()
        {
            _rsa = new RSACryptoServiceProvider(2048); // 建议使用2048位或更高
            _privateKey = _rsa.ExportParameters(true);  // 导出包含私钥的参数
            _publicKey = _rsa.ExportParameters(false); // 导出仅包含公钥的参数
        }

        /// <summary>
        /// 使用指定的公钥加密明文。
        /// </summary>
        /// <param name="plainText">待加密的明文。</param>
        /// <param name="publicKeyXml">XML格式的公钥字符串。</param>
        /// <returns>Base64编码的密文。</returns>
        public string Encrypt(string plainText, string publicKeyXml)
        {
            // 导入XML格式的公钥
            _rsa.FromXmlString(publicKeyXml);
            // 重新导入公钥参数,确保当前RSA实例使用正确的公钥
            // 注意:这里publicKeyXml通常应包含Modulus和Exponent
            // _publicKey = _rsa.ExportParameters(false); // 这一行在FromXmlString后通常不需要
            // _rsa.ImportParameters(_publicKey); // 这一行在FromXmlString后通常不需要

            var data = Encoding.Unicode.GetBytes(plainText); // 使用Unicode编码
            // RSA加密,第二个参数为false表示使用PKCS#1 v1.5填充
            var cypher = _rsa.Encrypt(data, false); 
            return Convert.ToBase64String(cypher); // 将密文转换为Base64字符串以便传输
        }

        /// <summary>
        /// 获取XML格式的私钥字符串。
        /// </summary>
        /// <returns>XML格式的私钥字符串。</returns>
        public string PrivateKeyString()
        {
            var sw = new StringWriter();
            var xs = new XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, _privateKey);
            return sw.ToString();
        }

        /// <summary>
        /// 获取XML格式的公钥字符串。
        /// </summary>
        /// <returns>XML格式的公钥字符串。</returns>
        public string PublicKeyString()
        {
            var sw = new StringWriter();
            var xs = new XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, _publicKey);
            return sw.ToString();
        }
    }
}

登录后复制

上述C#代码执行以下操作:

  1. 密钥生成: 在RSAEncrypter的构造函数中,通过new RSACryptoServiceProvider(2048)生成一个2048位的RSA密钥对。

    立即学习“PHP免费学习笔记(深入)”;

  2. 密钥导出: ExportParameters(true)用于导出包含所有私钥组件的RSAParameters结构,而ExportParameters(false)仅导出公钥组件。

  3. 密钥序列化: PrivateKeyString()和PublicKeyString()方法使用XmlSerializer将RSAParameters结构序列化为XML字符串。导出的私钥字符串示例如下:

    <?xml version="1.0" encoding="utf-16"?>
    <RSAParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Exponent>AQAB</Exponent>
      <Modulus>38Z4+7H1ADzMPO8z5+QdxXS21YBEaq9Xacf7dHFXUpK72SUAIYnfijc5RDSgGFismTNlrrOa7m/6+iIWS/yB7+esvIjgfSFm+QU2aeC16NisMuw+KvPeEr8CVMjh8F5YW1ST4qKXHXG6qIe/FM2LPVGV92O9WO1ATIDcATO8UU2rJgrxKMdmE9fawqmy/j7fwI1+FL6LCNgdvgZ3OOLLwHVcyOyj7ibiIUQAcw10qW0I4MBnQL5V8udKrhKXKoVE6rsfLZoBC9rBD62ckB7CJfMsGcAVffBvnd7SRJiTFEEPVZFqzyGk0BOeqbJkHbzKNytNkUjnFQlDX9tSLCtufQ==</Modulus>
      <P>+jlZUY/lv0bMWbcWVXZ+moDF96ZQ+uKHMbpAMN18ByRmZSLZ9CeHTNEkoudOzB6R9wN8xyEmnCrDZujSB65uBILdJvsJk8TYBThp5RBbBZ1YQb30CcxhsMX2s6Gwze8CoXmBU5as6tMDh+tBpxxeYxE/crS3rP7kAM2Lr88cILM=</P>
      <Q>5PDUdn/RB8dhxkjSFZS0MtrefVgYmoDNjN9O+Ru7ZzNz7eqig1zLlKytDQzmpaIv6Zvrn5Y5TBaFDp1BTVLAStu8e/RU4i7qWVu6Xm83xtgB4NDULXStyYqpeZhyilD4BsfIYeRyZ3A9wUyACQ6CU3GxuIczWYkfT3HmSy5ebA8=</Q>
      <DP>nEH/8x0nXeF6b3QUMF6FBTrxZYuo+mNIBdfHijxl3ZfvkazH6t5cca4RcOF9pZ5ZjKXS4A9lqxRRXgx6TG2zKoIGVPdjrbG5LNlj17X1AXaWzMcwhIXrY5bcTqTkYlWlkOztxCNN7H7Fr7VMFG10y+zTcHBGW3P5Mj8pwipV6F0=</DP>
      <DQ>DMkWVHfW6KRN5ZDzipj/Z0ep3T4qQZan5BIkiuztjlnlQ4gzAzsPc4IhN/VcfCuOmXFHu2XcVU98ptBJcVQJwSR8Zj/C7c7I76ybv+JeLxCpKjD/aHp3qiXASTYmT2suLtLBchYb/YLbMAxhqh/RT2+uCSwjxgBOa1VlExXH2Ck=</DQ>
      <InverseQ>zlFNPMXsmgjWz0rA5y3stzoKDiw0mbb1rU6iSXKKOZz5djokAX1tjtcwUbzdv3I5x8m+3K1qprXURUYbZXf+ubwkoYiG4WaJDWhZ+y33Q8iK87BUKy6Q062F4XryBVagCJHKMNStiiMmFB9IdbDu/wbYh52BjrwhwncLOEYaSaQ=</InverseQ>
      <D>YQvsEAv/WtkDIjIC6sBtgOK7ICB+i137pO6LyNYWrsLgIK4BPopSndiRR1kjTSu3vsEhigBuYpXB3JTH4rBhka+BpEogQWQpCjoOfSBtA8xj8bmuxGX6m1qnIin0gpAH9aPaduFYc/aMouYsIlN53V/yj9V7moNZ7VO9FfBf7UnX7yTc2/fvXz9atXepQmir2YOO41Z5KgytSF1M7R3eZq1GLTnaqRK+LCQ5cKkxqcIAtUX7BZgkLnHZs3zqLo998gXbogmkqxB4NWc9bwWjybC1CMWyZeiRuaw/Wye4GbNmpM7sfsB7GINndwCSqfJzwSetGCSca8x2wkms+5zOaQ==</D>
    </RSAParameters>

    登录后复制

  4. 加密数据: Encrypt方法接收明文和XML格式的公钥。它将明文编码为Unicode字节数组,然后使用_rsa.Encrypt(data, false)进行加密。false参数指定使用PKCS#1 v1.5填充。最后,密文被转换为Base64字符串以便于传输。

    C# RSA加密与PHP解密跨平台实现指南-第2张图片-佛山资讯网

    标签: php js git go github npm seo 编码 app ipv6 字节 工具 qq ssl csv ai

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~