0

0

C# RSA加密与PHP解密互操作指南

霞舞

霞舞

发布时间:2025-12-04 13:50:23

|

173人浏览过

|

来源于php中文网

原创

c# rsa加密与php解密互操作指南

本文旨在提供一套完整的跨平台RSA加密解密方案,详细阐述如何在C#应用程序中生成RSA密钥对并进行数据加密,随后在PHP环境中利用私钥对密文进行解密。核心内容包括C#加密实现、XML格式私钥到PEM格式的转换方法,以及PHP解密过程中的Base64解码与OpenSSL函数应用,确保数据在不同语言环境间的安全传输与处理。

1. 引言

在现代软件开发中,跨语言、跨平台的数据安全传输是常见的需求。RSA作为一种非对称加密算法,广泛应用于数据加密、数字签名等场景。本文将聚焦于一个具体的实践问题:如何使用C#进行RSA数据加密,并随后在PHP环境中进行解密。这涉及到密钥格式的兼容性、数据编码以及不同语言的加密库使用细节。

2. C# RSA加密实现

在C#中,我们可以使用System.Security.Cryptography命名空间下的RSACryptoServiceProvider类来生成RSA密钥对并执行加密操作。

2.1 密钥生成与管理

首先,创建一个RSAEncrypter类来封装密钥的生成和加密逻辑。构造函数中,我们初始化一个2048位的RSA服务提供者,并导出公钥和私钥参数。

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

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;

        public RSAEncrypter()
        {
            // 初始化2048位的RSA密钥对
            _rsa = new RSACryptoServiceProvider(2048);
            // 导出私钥参数(包含所有秘密信息)
            _privateKey = _rsa.ExportParameters(true);
            // 导出公钥参数(只包含公开信息)
            _publicKey = _rsa.ExportParameters(false);
        }

        // 获取私钥的XML字符串表示
        public string PrivateKeyString()
        {
            var sw = new StringWriter();
            var xs = new XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, _privateKey);
            return sw.ToString();
        }

        // 获取公钥的XML字符串表示(如果需要外部提供公钥进行加密)
        public string PublicKeyString()
        {
            var sw = new StringWriter();
            var xs = new XmlSerializer(typeof(RSAParameters));
            xs.Serialize(sw, _publicKey);
            return sw.ToString();
        }
    }
}

注意: 在实际应用中,私钥应严格保密,不应随意通过字符串形式传输或存储在不安全的地方。这里为了演示方便,将其导出为字符串。

2.2 数据加密

加密方法接收明文和公钥字符串。在加密前,需要将传入的公钥字符串反序列化回RSAParameters对象,并导入到RSACryptoServiceProvider实例中。

Detect GPT
Detect GPT

一个Chrome插件,检测您浏览的页面是否包含人工智能生成的内容

下载
// 续 RSAEncrypter 类
public string Encrypt(string plainText, string publicKeyXml)
{
    // 创建一个新的RSACryptoServiceProvider实例用于加密,避免与当前实例的私钥混淆
    using (var rsaEncryptor = new RSACryptoServiceProvider())
    {
        // 从XML字符串导入公钥
        rsaEncryptor.FromXmlString(publicKeyXml);

        // 将明文转换为字节数组,使用Unicode编码确保字符兼容性
        var data = Encoding.Unicode.GetBytes(plainText);

        // 执行RSA加密,第二个参数为false表示使用PKCS#1 v1.5填充(默认)
        var cypher = rsaEncryptor.Encrypt(data, false);

        // 将加密后的字节数组转换为Base64字符串,以便于传输和存储
        return Convert.ToBase64String(cypher);
    }
}

C#导出的RSAParameters XML格式私钥示例如下:



  AQAB
  38Z4+7H1ADzMPO8z5+QdxXS21YBEaq9Xacf7dHFXUpK72SUAIYnfijc5RDSgGFismTNlrrOa7m/6+iIWS/yB7+esvIjgfSFm+QU2aeC16NisMuw+KvPeEr8CVMjh8F5YW1ST4qKXHXG6qIe/FM2LPVGV92O9WO1ATIDcATO8UU2rJgrxKMdmE9fawqmy/j7fwI1+FL6LCNgdvgZ3OOLLwHVcyOyj7ibiIUQAcw10qW0I4MBnQL5V8udKrhKXKoVE6rsfLZoBC9rBD62ckB7CJfMsGcAVffBvnd7SRJiTFEEPVZFqzyGk0BOeqbJkHbzKNytNkUjnFQlDX9tSLCtufQ==
  

3. PHP RSA解密实现

PHP的openssl扩展提供了强大的加密功能,但它通常期望PEM(Privacy-Enhanced Mail)格式的密钥。C#导出的XML格式密钥不能直接被PHP识别,因此需要进行转换。

3.1 密钥格式转换:XML到PEM

这是C#与PHP互操作的关键一步。C#的RSAParameters XML格式包含了RSA私钥的所有组成部分(模数、指数、素数因子等)。PEM格式的私钥通常是PKCS#1或PKCS#8标准,它们将这些参数编码为ASN.1结构,然后进行Base64编码,并用-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----(或-----BEGIN PRIVATE KEY-----)等头尾标记包裹。

由于C#没有直接导出PEM格式私钥的功能,我们需要一个外部工具或脚本来完成这个转换。通常,这个过程涉及:

  1. 解析C#导出的XML字符串,提取Modulus、Exponent、P、Q、DP、DQ、InverseQ、D等Base64编码的参数。
  2. 将这些Base64编码的参数解码为原始字节
  3. 按照PKCS#1 RSA私钥的ASN.1结构(SEQUENCE of INTEGERs)重新组装这些字节。
  4. 对组装后的ASN.1结构进行Base64编码。
  5. 在Base64编码的字符串前后添加PEM格式的头尾标记。

有许多开源库或脚本可以实现此功能,例如GitHub上的一些Gist或专用的密钥转换工具。一旦转换完成,你的私钥将看起来像这样:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwGbWRx8kEz5+BHt5f8/R4ka7AOBGbP1YjfhY33eUQzsh6Ygl
jAvPYXmopaSEOLWAjq/TTCGXGmSfZi0DRPGeSnNXzU6nUu1qQBC5sQYIPSph/lEV
S7jv8isVO9/vH+TGCwE0CeGiQt1QP/m72Vaux3U6nt6ddVat3rpHy4FVuuDHKF58
9HQakf5cMCz4wei4y71U/tLIj1F7P5TRqSdKMB4ZLYLDbX+32OEPMEP6DJEysAiC
oRdpBR/KCOlH3QHEF0RDuTbdgL6f8oAuN2Wvr+p+f1lnkld08+gyKma9cEBpeIB7
cjBeNNcImyhXfp8VBjjZNd//ikt7jnDle30MWQIDAQABAoIBADuxbDfCrKGf2N8x
I+AIrTiD807xRkhYTdo2O/SRGBnHxdy7ldKec2fto+pIYZFqlokueeL75PKWV3IO
8x23zQGSSaJ0DavH5xgbWFFY6sN3W9HYfD/zD9bVkQ/ziTAe/Wa6p9eM/pe6LES9
CZADudQ+RcK2lKmsC+O3bcDwzpVczzuZ1s29F6Jc2L0Q7e1ce9FfBmhl/faei7ro
5DWV30+AqhdwPppMhOWFS/walro8Sq90Kz0chaU6N1vVBEdo4dSLKYapyxJwAHhm
HfNkA+wMrsMXGd9eKpi4u8AupnJYypFdBaEEgrKIbg21LLRTyx1fFKXWdE0puG7H
0GVfoNUCgYEAxoaCzv7LslAOa8bZwGVxcvnE0tIafPwXyOldH/jqeXf53I1gOmFM
dI143wawKQES8CvrbedzP/5tNVZhdrOOekTRM61yw3xSUYY5e8Ngt/gn4KyQ0nA5
X75QjtC6VxNM6ssFpyUxQT95lvTo13avrVjhnGt3raNxwTgiqJjvTfsCgYEA+Bp5
FElve0NnfvkpYeffuF6E3mTRS44IH7qRTFrpXh31zwMxE6K3cltbRtHtuf5/7DmR
XpbeogxG4Bzzw/Y7DodV3V82ApIzyhFkN5PPfg5mR/W8cia82Q3QsRMpjYTo9TBZ
aiAsTbUz8E6KaFrS64V6KbRl84EE8XBaG7tvYrsCgYBZ4TZBzvub7EDLLMkTIRpe
6pPgurzBT0TZckX2HrTRb68Q2nTxmXGK5y4NEzMYLWNMlyXMqVf1ZhQ9bLFNk3dz
BcsNMX7e4F9Ih5No5Aja4Z/0SUx76dEf9sL0Fa33lEZjmq0hgmYtWzaKULFGM3bP
7YifT8xsMa5jwy111V+qlwKBgQCjtHwN+cKYd8pTir5WfrQsqBlN0QIUs3wCy4zR
7+6qDmTCGl4IkcYvq74Xha8xmY745KdZ3Xy7OhSODix+MfuXw47RieBOY//OJhmV
Xm97wq6Ubr3QKGVVZvs7y+QQIBHCrwtgriftglHqDzjeUId5plIMMJ9Qw+HqGXMr
d0qwvwKBgQCjNuhKMHGqG6DuYiLQjJVHA6aG87K5tfNNC8yQPOIbkIJTlSzGQIkm
66wA2PSCI+yRixm+gZWGdVcYuVvcfTHLsledLocTWBRf/2VAGlqZg1ewybGrrixF
05KXg9DcAK9HFyZryFZAXtLyAoRaS1ElcSVBtLggQreGsr8fIM5Fvw==
-----END RSA PRIVATE KEY-----

3.2 数据解密

在PHP中,使用openssl_private_decrypt函数进行解密。需要注意的是,C#加密后输出的是Base64编码的字符串,因此在PHP解密前必须先使用base64_decode将其转换回原始的二进制密文。

					

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2699

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1665

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1527

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1443

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1529

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号