yunque9/wb_unity_pro/Assets/Scripts/RSAHelper.cs

98 lines
7.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Text;
using System.Security.Cryptography;
public static class RSAHelper
{
private static string publicKey =
"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAmZLmb4paD13E2uOueFStT1g8OnA4JQYkN4PZl/il7Nb05EbZrRbQz/5VbiZxc+S4asfFrrU0d++gjiluiAbBBhgtQSi+eNZuJ2wrBxjvN3W9d14XMmZKDg21Knu7tDUwOlEfCPVMZ/nJ+9YU6mnEvme29UgpI4RbEIIWPuDW3DavbaOvZ/cYP+0m2pxU3mETwDbVpbM3LimJ4JOBIs7XhV2UqEUfRVCYiuZUkydOCs1TgTJRJC5qgYpx4wUZ0ja7t9jP3klg/vjjyA1SDnC98bQLR5QzVJE1LvI2Rr3AHfZS0hckg0WAR87D1R8sGjmQ0TUi4qanpQYhEL4dBH8a6TX/xssobM7M+XgFsGiT4fWG18JhJM98rhVEk2AUaXgnFNf3OyLP+NuYrqjYamuug00s2azCl/rQCkvnLWO4W+lPn27ZinnBRg1+r2fNws7dPPa/8tWScRcTtfaidYsQP2lnYJvFgc299HdQL7iFgL336NihUxll09Hhm7vf8+N0ZP5TLE8SRoSfHNgHup6k9YG5e+V9bW4VckQFgPPBlHSS0mDEOvD9d54+F1cBg/sG8XMduW5WhfroYsMbRzB9a4rIfctn6yqpM+ot2EW8CKgiOVM5lJQhBwX5rMKnMTaApt6EIigY6jRVFNCOtQPDZ9prLBsp3asQxf7Vg9kfrVUCAwEAAQ==";
private static string privateKey =
"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";
// 公钥加密
public static string Encrypt(string plainText)
{
using (RSACryptoServiceProvider rsa = RSAHelper.CreateFromBase64PublicKey(publicKey))
{
byte[] data = Encoding.UTF8.GetBytes(plainText);
byte[] enc = rsa.Encrypt(data, false);
Debugger.Log(Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes("{\"password\":\"111111\",\"deviceCode\":\"281a228fac1c29d25c1a3e572b15ad47d5f66811\",\"id\":777777}"),false)));
return Convert.ToBase64String(enc);
}
}
/// <summary>
/// 将 Base64 公钥DER 格式)转换成 RSACryptoServiceProvider 可用的 XML 公钥
/// </summary>
/// <param name="base64PublicKey">Base64 编码的 DER 公钥</param>
/// <returns>RSACryptoServiceProvider 实例</returns>
private static RSACryptoServiceProvider CreateFromBase64PublicKey(string base64PublicKey)
{
byte[] keyBytes = Convert.FromBase64String(base64PublicKey);
// 解析 DER 格式的公钥,获取 Modulus 和 Exponent
int offset = 0;
if (keyBytes[offset++] != 0x30) throw new Exception("Invalid public key format");
ReadLength(keyBytes, ref offset); // 跳过序列长度
// 跳过算法标识部分
if (keyBytes[offset++] != 0x30) throw new Exception("Invalid public key format");
ReadLength(keyBytes, ref offset);
offset += 13; // rsaEncryption OID + NULL
if (keyBytes[offset++] != 0x03) throw new Exception("Invalid public key format");
int bitStringLength = ReadLength(keyBytes, ref offset);
offset++; // unused bits
if (keyBytes[offset++] != 0x30) throw new Exception("Invalid public key format");
ReadLength(keyBytes, ref offset);
// 读取 Modulus
if (keyBytes[offset++] != 0x02) throw new Exception("Invalid public key format");
int modulusLength = ReadLength(keyBytes, ref offset);
byte[] modulus = new byte[modulusLength];
Array.Copy(keyBytes, offset, modulus, 0, modulusLength);
offset += modulusLength;
// 读取 Exponent
if (keyBytes[offset++] != 0x02) throw new Exception("Invalid public key format");
int exponentLength = ReadLength(keyBytes, ref offset);
byte[] exponent = new byte[exponentLength];
Array.Copy(keyBytes, offset, exponent, 0, exponentLength);
// 构造 XML
string xml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(modulus)}</Modulus><Exponent>{Convert.ToBase64String(exponent)}</Exponent></RSAKeyValue>";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xml);
return rsa;
}
private static int ReadLength(byte[] data, ref int offset)
{
int length = data[offset++];
if ((length & 0x80) == 0x80)
{
int bytesCount = length & 0x7F;
length = 0;
for (int i = 0; i < bytesCount; i++)
{
length = (length << 8) | data[offset++];
}
}
return length;
}
// 私钥解密
public static string Decrypt(string cipherText)
{
using (RSACryptoServiceProvider rsa = RSAHelper.CreateFromBase64PublicKey(privateKey))
{
byte[] data = Convert.FromBase64String(cipherText);
byte[] dec = rsa.Decrypt(data, false);
return Encoding.UTF8.GetString(dec);
}
}
}