如何将PHP OpenSSL加密调用改写为.NET 6 Cryptography实现
.NET 6 对应加密逻辑实现
核心逻辑对齐说明
你提供的PHP代码做了三件事:
- 生成16字节随机AES密钥
- 用AES-128-ECB算法、PKCS7填充加密明文,直接输出二进制密文
- 用RSA私钥以PKCS#1 v1.5填充加密AES密钥,输出加密后的AES密钥
.NET 6 可以直接用内置的System.Security.Cryptography命名空间完成全部逻辑,无需引入第三方包。
完整实现代码
using System.Security.Cryptography; using System.Text; // 输入参数 string plainText = "Test payload"; string privateKeyPem = "-----BEGIN RSA PRIVATE KEY----- ... "; // 1. 生成16字节AES密钥 byte[] aesKey = RandomNumberGenerator.GetBytes(16); // 2. AES-128-ECB 加密明文 byte[] encryptedText; using (Aes aes = Aes.Create()) { aes.Key = aesKey; aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; // 对齐PHP openssl_encrypt默认填充规则 ICryptoTransform encryptor = aes.CreateEncryptor(); byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); encryptedText = encryptor.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length); } // 3. RSA私钥加密AES密钥 byte[] aesKeyEncrypted; using (RSA rsa = RSA.Create()) { // 导入PEM格式私钥,如果私钥加密请用ImportFromEncryptedPem方法 rsa.ImportFromPem(privateKeyPem); // 对齐PHP openssl_private_encrypt默认的PKCS#1填充规则 aesKeyEncrypted = rsa.SignData(aesKey, HashAlgorithmName.None, RSASignaturePadding.Pkcs1); } // 输出结果,如需转base64传输可调用Convert.ToBase64String // Console.WriteLine(Convert.ToBase64String(encryptedText)); // Console.WriteLine(Convert.ToBase64String(aesKeyEncrypted));
注意事项
- 如果第三方服务解析明文使用的不是UTF-8编码,请调整
Encoding.UTF8.GetBytes的编码类型,和服务端对齐 - 如果你的RSA私钥是带密码的加密格式,请将
ImportFromPem替换为ImportFromEncryptedPem(privateKeyPem, "私钥密码") - ECB模式安全性较低,此处仅为对齐第三方接口要求,自主设计加密方案时不推荐使用
内容的提问来源于stack exchange,提问作者alik
相关产品推荐
相关产品推荐

