C#和JS同步使用RSA加密解密
C#使用RSA加密解密
/// <summary> /// RSA加密解密 /// </summary> public class RSAHelper { /// <summary> /// 生成公钥和私钥 /// </summary> /// <param name="keySize">密钥大小 默认1024 建议2048位或更长的密钥长度以提供足够的安全性,典型情况下,RSA密钥的长度为2048位。</param> /// <param name="privateKey">输出私钥</param> /// <param name="publicKey">输出公钥</param> public static void GenerateKeys(int keySize, out string privateKey, out string publicKey) { using (var rsa = new RSACryptoServiceProvider(keySize)) { privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey()); publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey()); } } /// <summary> /// 加密 /// </summary> /// <param name="publicKey">公钥</param> /// <param name="data">要加密的数据</param> /// <returns>加密后的数据</returns> public static string Encrypt(string publicKey, string data) { using (var rsa = new RSACryptoServiceProvider()) { rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _); var bytes = Encoding.UTF8.GetBytes(data); var encryptedBytes = rsa.Encrypt(bytes, RSAEncryptionPadding.Pkcs1); return Convert.ToBase64String(encryptedBytes); } } /// <summary> /// 解密 /// </summary> /// <param name="privateKey">私钥</param> /// <param name="data">要解密的数据</param> /// <returns>解密后的数据</returns> public static string Decrypt(string privateKey, string data) { using (var rsa = new RSACryptoServiceProvider()) { rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _); var encryptedBytes = Convert.FromBase64String(data); var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.Pkcs1); return Encoding.UTF8.GetString(decryptedBytes); } } /// <summary> /// RSA私钥签名 /// </summary> /// <param name="privateKey">私钥</param> /// <param name="data">要签名的数据</param> /// <returns>签名数据</returns> public static string SignData(string privateKey, string data) { using (var rsa = new RSACryptoServiceProvider()) { rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _); var bytes = Encoding.UTF8.GetBytes(data); var signatureBytes = rsa.SignData(bytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); return Convert.ToBase64String(signatureBytes); } } /// <summary> /// 验证RSA签名 /// </summary> /// <param name="publicKey">公钥</param> /// <param name="data">原始数据</param> /// <param name="signatureData">签名数据</param> /// <returns></returns> public static bool VerifyData(string publicKey, string data, string signatureData) { using (var rsa = new RSACryptoServiceProvider()) { rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _); var bytes = Encoding.UTF8.GetBytes(data); var signatureBytes = Convert.FromBase64String(signatureData); return rsa.VerifyData(bytes, signatureBytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); } } }
JS加密解密(公钥私钥建议后端生成)https://codeload.github.com/travist/jsencrypt/zip/refs/tags/v3.3.2
<!DOCTYPE html> <html lang="zh-Hans"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> <script src="./jquery.js"></script> <script src="./jsencrypt.min.js"></script> <script> var pubKey = ""; var priKey = ""; function RSAencrypt() { var enctypt1 = new JSEncrypt(); enctypt1.setPublicKey(pubKey); var enctypted = enctypt1.encrypt("ADBDHudusjks有@#$%^&*()(__+123456789!"); console.log("加密:" + enctypted); return enctypted; } function RSAdecrypt(crypt) { var decrypt1 = new JSEncrypt(); decrypt1.setPrivateKey(priKey); var decrypted = decrypt1.decrypt(crypt); console.log("解密:" + decrypted); return decrypted; } RSAdecrypt(RSAencrypt()); </script> </head> </html>