重点 :
三个参数: n. e1. e2. n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取
术语:
公钥. PublicKey
私钥. PrivateKey
明文 Plaintext
密文. Ciphertext
C#脚本实现
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class Enc : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
var path = Application.streamingAssetsPath;
var privateKey = File.ReadAllText(path + "/privateKey.xml");
var publicKey = File.ReadAllText(path + "/publicKey.xml");
string macid = SystemInfo.deviceUniqueIdentifier;//获取电脑id
//把macid转换成64位的string
byte[] bys = System.Text.Encoding.UTF8.GetBytes(macid);
string a2 = Convert.ToBase64String(bys);
byte[] by2 = RSAEncrypt(publicKey, bys);//加密64位的string
string str = Convert.ToBase64String(by2);//返回加密后的64位string
print(str);
//解密a a是64位string
string a = "L4gJ8xa6ZVjqwkN2L+e3VpheESfL4NfvVm0utzZHPJEerqT3tqMH0QDGPFzlLwq1rr8M1Xjs4Rg9tSq/jYhk7sNY6KgsbC2RgYv65Z/cCuWH+23ZPTPFtjInQsJb/4DU7lTHgwsQ3UXjT4oapgP8VOpjTNqx7lMDOHLyHJyWG/Q=";
byte[] mimi = Convert.FromBase64String(a);
byte[] jiemi = RSADecrypt(privateKey, mimi);
string mingwen = Convert.ToBase64String(jiemi);
print(mingwen);
}
// Update is called once per frame
void Update()
{
}
/// <summary>RSAs the encrypt.RSA加密.</summary>
/// <param name="publickey">The publickey.</param>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] RSAEncrypt(string publickey, byte[] data)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publickey);
var bytes = rsa.Encrypt(data, false);
return bytes;
}
/// <summary>RSAs the decrypt.RSA解密.</summary>
/// <param name="privatekey">The privatekey.</param>
/// <param name="data">The data.</param>
/// <returns></returns>
public static byte[] RSADecrypt(string privatekey, byte[] data)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privatekey);
var bytes = rsa.Decrypt(data, false);
return bytes;
}
/// <summary>Generates the keys.生成密钥.</summary>
public static void GenerateKeys()
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
var privateKey = rsa.ToXmlString(true);
var publicKey = rsa.ToXmlString(false);
var path = Application.streamingAssetsPath;
File.WriteAllText(path + "/privateKey.xml", privateKey);
File.WriteAllText(path + "/publicKey.xml", publicKey);
}
}