1、生成一对公、私密钥(公钥用于加密,私钥用于解密)
/// <summary>
/// 随机获取公钥和私钥的字符
/// </summary>
/// <param name="strength">长度</param>
/// <returns></returns>
public static List<string> CreateKeyPair(int strength = 1024)
{
RsaKeyPairGenerator r = new RsaKeyPairGenerator();
r.Init(new KeyGenerationParameters(new SecureRandom(), strength));
AsymmetricCipherKeyPair keys = r.GenerateKeyPair();
TextWriter privateTextWriter = new StringWriter();
PemWriter privatePemWriter = new PemWriter(privateTextWriter);
privatePemWriter.WriteObject(keys.Private);
privatePemWriter.Writer.Flush();
TextWriter publicTextWriter = new StringWriter();
PemWriter publicPemWriter = new PemWriter(publicTextWriter);
publicPemWriter.WriteObject(keys.Public);
publicPemWriter.Writer.Flush();
List<string> revalue = new List<string>();
revalue.Add(publicTextWriter.ToString());
revalue.Add(privateTextWriter.ToString());
return revalue;
}
/// <summary>
/// RSA加密 将公钥导入到RSA对象中,准备加密
/// </summary>
/// <param name="PublicKey">公钥</param>
/// <param name="encryptstring">待加密的字符串</param>
public static string RSAEncrypt(string PublicKey, string encryptstring)
{
using (TextReader reader = new StringReader(PublicKey))
{
dynamic key = new PemReader(reader).ReadObject();
var rsaDecrypt = new Pkcs1Encoding(new RsaEngine());
if (key is AsymmetricKeyParameter)
{
key = (AsymmetricKeyParameter)key;
}
else if (key is AsymmetricCipherKeyPair)
{
key = ((AsymmetricCipherKeyPair)key).Private;
}
rsaDecrypt.Init(true, key); //这里加密是true;解密是false
byte[] DataToEncrypt = Encoding.UTF8.GetBytes(encryptstring);
byte[] outBytes = rsaDecrypt.ProcessBlock(DataToEncrypt, 0, DataToEncrypt.Length);//加密
string strBase64 = Convert.ToBase64String(outBytes);
return strBase64;
}
}
/// <summary>
/// RSA加密 将私钥导入到RSA对象中,准备解密
/// </summary>
/// <param name="privateKey">私钥</param>
/// <param name="decryptstring">待解密的字符串</param>
/// <returns></returns>
public static string Decrypt(string privateKey, string decryptstring)
{
using (TextReader reader = new StringReader(privateKey))
{
dynamic key = new PemReader(reader).ReadObject();
var rsaDecrypt = new Pkcs1Encoding(new RsaEngine());
if (key is AsymmetricKeyParameter)
{
key = (AsymmetricKeyParameter)key;
}
else if (key is AsymmetricCipherKeyPair)
{
key = ((AsymmetricCipherKeyPair)key).Private;
}
rsaDecrypt.Init(false, key); //这里加密是true;解密是false
byte[] entData = Convert.FromBase64String(decryptstring);
entData = rsaDecrypt.ProcessBlock(entData, 0, entData.Length);
return Encoding.UTF8.GetString(entData);
}
}
2、页面一加载把公钥传到前端用于加密
前端加密代码:
var rsa = new JSEncrypt();
var pubkey = $("#pubkey").val();
rsa.setPublicKey(pubkey);//公钥用于加密
var stuName= rsa.encrypt(“要加密的字段”)
3、后端接收参数解密
var privatekey = context.Session["privatekey"].ToString();//私钥用于解密
string stuName=Decrypt(privatekey, "前段传过来的加密字段");