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>
复制代码

 

posted @   杜子烟  阅读(137)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示