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 =
"MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCZkuZviloPXcTa4654VK1PWDw6cDglBiQ3g9mX+KXs1vTkRtmtFtDP/lVuJnFz5Lhqx8WutTR376COKW6IBsEGGC1BKL541m4nbCsHGO83db13XhcyZkoODbUqe7u0NTA6UR8I9Uxn+cn71hTqacS+Z7b1SCkjhFsQghY+4NbcNq9to69n9xg/7SbanFTeYRPANtWlszcuKYngk4EizteFXZSoRR9FUJiK5lSTJ04KzVOBMlEkLmqBinHjBRnSNru32M/eSWD++OPIDVIOcL3xtAtHlDNUkTUu8jZGvcAd9lLSFySDRYBHzsPVHywaOZDRNSLipqelBiEQvh0EfxrpNf/Gyyhszsz5eAWwaJPh9YbXwmEkz3yuFUSTYBRpeCcU1/c7Is/425iuqNhqa66DTSzZrMKX+tAKS+ctY7hb6U+fbtmKecFGDX6vZ83Czt089r/y1ZJxFxO19qJ1ixA/aWdgm8WBzb30d1AvuIWAvffo2KFTGWXT0eGbu9/z43Rk/lMsTxJGhJ8c2Ae6nqT1gbl75X1tbhVyRAWA88GUdJLSYMQ68P13nj4XVwGD+wbxcx25blaF+uhiwxtHMH1rish9y2frKqkz6i3YRbwIqCI5UzmUlCEHBfmswqcxNoCm3oQiKBjqNFUU0I61A8Nn2mssGyndqxDF/tWD2R+tVQIDAQABAoICAA0KYVDlYaJeZwHjRYRoRFMxfePEdbAHJnokUwzJi2ViF2du8Lr27gJLaXux/f5GVLaUgh/EuVDZ4ztPH1ijoi5fTTB0QkBGjRIB6GFw55dBAzaoobWg4/bviQuzeAvkXFUHYGhFVBicKF+fHSWOl6tHaUzItN2UNptfQH5UX0pRxnG77YAZhlCfVaZIkhhUC/ZNcbThU/Uyh8evHs8S21Ay0xW60N306w8YYeQg+UqHhui4mhVFb7vSQrtxSnEEPspsubH5bygXgFgTcX1Sa36juDV6yyUKM4bqAFvfbvncWcoHNw2CkFMIpq5pODh93OM27OBsIF4t+A7Q5evk0ycJzydb0b/TKosxvv55ft1LKSUa/d0Kz88rCBHlHmome1sIXXYVOCoaynOEGh+fxCfAnIZ3Jskr/EUFvfCduM4bIzY/vWI/aRKm0XlatTiM7IfefrYr3mrXPRzRg2BV9l7mftrRUP8y3+QgacmskG1TpfHBigAwXKUjYMm2FQAHldes+oMwRJZQqDzWy9u5FQPfIP0yPdp5ICPTcTePFV2GEk6aLWbNNflfU3W8JheR52rj9A52yAmaLq1ovcFL4Y5sCG4AzOivB4Dp7O2NQklFG9RrWR0Pf2SUh+Fax5j5WLWTyi8fQykfknhdr/0K7OKDN9FlLhtGQSx9Nfv4Fdn9AoIBAQD75tsHcBWh9A9/VKRB9eJkKtIQigkVQMhtV+QMRn+UuWTdSXVVwBOHKJjDponKp+BaKBNZPaNV/QItCjpTXIPZ44zCy0bxQVmcN17pTNX95o+GfDrVD42z/xO9ljmZLPCs4GDfpAndt4VzOil4jEyLqsZRbLtaLuVyL6v0BJAA538cL2scQ6eI9OlHFPRjxTxCIXnX8LDaFWl4/jOrSSGr+nrZ+eZlQlvYIz0T0s2lzTTiFk7qTJ1u3XknU4xn90nfhQYNyd1nyp4zK38zEOcQomxZthuid3OHu8vFgCfIuoAvz1MiLsZe42nd3CVUxWviW87HMrWTxy6ZmmxdNB8/AoIBAQCcEoTcGJe4Nz8+1e5F7cZusy7zt12SLFlzJkhSFom/2Iai7j8fWRHck9xeGqi97NoGMEnzxy7wSwEJJudlHuZHBhG1Uagx0UxE7VO0tpjm/qUz+bebdtlf3NS0O00Kvg1rh4ldSJejhR9fcxUAEoKIuekYfYSjtpApO3pYFf3HsPON2xBsdSqt5XmUUgUpxfb56E/sYVL1fujXTxxSx0R8VPbavlMjOaHygRydcinvhCGF/bDEmicB4ujmNBuuCJ/qtPPXy+Uwwlejgv419ZVzwFEhMEhKvz1KDfNEaVY1WCoQSX2UUrr2QxIfcOITpbuPzgOIVqKrTPYYbpr//+JrAoIBAQC5nDdT2bD27sDkj9egiq9QI4U5jpx2vo9wkkyFBwVG7vx1WYVNtAQvmShHMdViMCTOCa2IGjTaTV1nFpw3hHna+SJk/ie96OtAgkQ7H9SmC1dCPxOSnq1JLfC7x4+VYFnO6F45K8PhTTLV3stj+e0FFMaghL/gCaIjayEG4r3BDNLKT95aqzctYVjqeXRCd7iY+dWv2bhWWWSoNJaZ5X8cG6qeJtcvUaAfOIfurWu+eeA3nzxyxBVU9XgqFBPnH32dZ4U4b7/mlJPRHIHTfObliOjRia//HIlSQHw7gNzPuSxvDhMxosmkbWk6gtY3CmkeF4vbl2/X/fJGWFT0sE09AoIBADL79bz0p7N9EMMVHbZoW3dUP5VMJFwY8sukCOIQDMXIFQtqquIxtZ0KDGYNbWxF0F9PLQle2x2SUu9LbzHgazduayCBYWGMzs6BfOO+9qoXK56UB//YTmB7glyyNpO4zCeBakU37plzZnFG5ehVI6FIojXm4wqcG/HsRSY7YOD4FEgV9QKJL/0IxrPGK3ue+PRgiKNek7wwzh1v8X+1KtE27EE/BWevbxEKTm+8mKhu0Ii1/CXteaqrFowFH7m1hZAltrabG+7WvcxjgWndJQpgG+CspiEM4hesAPkrNAdPGsahS03FzN+fv27X8HKcpG3wzcSfEJrHFGmc0DOqwqsCggEAJ+ICyEbmQ94Ibtha4QJSeFCgVO29eM0/O8e8beGv3+zrxrt5kQLFrrvJIke2iAnRbmBkX0BDyTMQ5LdexGp1R1272Q9HAysjsWitw4GHV4CZK6dezm7slDTx/8z6bD1B2oeFboyuevB04sFZVUY3qzbuIEQYpvU9nwThxP/sVq+1v2ilXPD2iSXdVScGkNUVmpF4asiteYvS6feohV/HMMm71D/CeENcHfgSiqZyW1hHsDxgSwYOQcCpEdrXTF7ly/SpKDjYfmljCPvFwpECO8pNG90/e/CY+6H7jpAS00AFRzK+/bs6JW5gQE1zC/O05DB77oREVfk9NI6eElY4ZA==";
// 公钥加密
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);
}
}
///
/// 将 Base64 公钥(DER 格式)转换成 RSACryptoServiceProvider 可用的 XML 公钥
///
/// Base64 编码的 DER 公钥
/// RSACryptoServiceProvider 实例
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 = $"{Convert.ToBase64String(modulus)}{Convert.ToBase64String(exponent)}";
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);
}
}
}