• C# RSA 无 长度限制 加密解密 示例


    RSA 是一种非对称加密算法。由于算法特性,加密和解密过程用不同密钥,即公钥和私钥,而被广泛应用于数字证书的安全管理。 在具体应用中,公钥用加密而私钥用于解密,或 私钥用于数字签名而公钥用于签名验证。由于非对称加密算法比价复杂,耗时较长,所以一般在网络环境中RAS 被应用于 签名认证,或小数据传输,如 AES 对称密钥传输。

    在.Net 框架中,默认提供的辅助类只能对密钥长度大小相同的数据进行加密解密。 此文提供C# RSA 算法示例一座优化,可以不限数据大小。此实例 仅供交流学习。

    RSA 加密
    public string RsaEncrypt(string rawInput, string publicKey)
    {
    if (string.IsNullOrEmpty(rawInput))
    {
    return string.Empty;
    }

    if(string.IsNullOrWhiteSpace(publicKey))
    {
    throw new ArgumentException("Invalid Public Key");
    }

    using (var rsaProvider = new RSACryptoServiceProvider())
    {
    var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流
    rsaProvider.FromXmlString(publicKey);//载入公钥
    int bufferSize = (rsaProvider.KeySize / 8) - 11;//单块最大长度
    var buffer = new byte[bufferSize];
    using (MemoryStream inputStream = new MemoryStream(inputBytes),
    outputStream = new MemoryStream())
    {
    while (true)
    { //分段加密
    int readSize = inputStream.Read(buffer, 0, bufferSize);
    if (readSize <= 0)
    {
    break;
    }

    var temp = new byte[readSize];
    Array.Copy(buffer, 0, temp, 0, readSize);
    var encryptedBytes = rsaProvider.Encrypt(temp, false);
    outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);
    }
    return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输
    }
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    RSA 解密
    public string RsaDecrypt(string encryptedInput, string privateKey)
    {
    if (string.IsNullOrEmpty(encryptedInput))
    {
    return string.Empty;
    }

    if (string.IsNullOrWhiteSpace(privateKey))
    {
    throw new ArgumentException("Invalid Private Key");
    }

    using (var rsaProvider = new RSACryptoServiceProvider())
    {
    var inputBytes = Convert.FromBase64String(encryptedInput);
    rsaProvider.FromXmlString(privateKey);
    int bufferSize = rsaProvider.KeySize / 8;
    var buffer = new byte[bufferSize];
    using (MemoryStream inputStream = new MemoryStream(inputBytes),
    outputStream = new MemoryStream())
    {
    while (true)
    {
    int readSize = inputStream.Read(buffer, 0, bufferSize);
    if (readSize <= 0)
    {
    break;
    }

    var temp = new byte[readSize];
    Array.Copy(buffer, 0, temp, 0, readSize);
    var rawBytes = rsaProvider.Decrypt(temp, false);
    outputStream.Write(rawBytes, 0, rawBytes.Length);
    }
    return Encoding.UTF8.GetString(outputStream.ToArray());
    }
    }
    }

  • 相关阅读:
    巧用SQL生成SQL语句
    update,delete与INNER JOIN 以及删除重复数据
    sql判断各种类型的东西存在与否(参考)
    附加数据库报错823
    hibernate配置文件hibernate.cfg.xml的详细解释
    向数据库插入图片以及从数据库中读取图片并显示到jsp(数据库中存储的图片字段类型为Blob或image)
    Hibernate中hibernateTemplate()方法总结
    spring MVC之构造ModelAndView对象
    手机网站初步布局,如何建立你自己的手机网站?
    (MoMoCMS教程2)创建页面——主菜单
  • 原文地址:https://www.cnblogs.com/Alex80/p/11541476.html
Copyright © 2020-2023  润新知