zoukankan      html  css  js  c++  java
  • 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());
    }
    }
    }

  • 相关阅读:
    contentEditable
    Web开发工具(插件)收集
    用limit 传变量TO 存储过程解决方案(续)
    ASP.NET1.1和ASP.NET2.0中数据库连接字符串的不同设置
    按比例微缩图片的一段小小的JS代码
    研究下市场上有哪些软件项目/产品,哪些是值得做的?
    Ajax联动下拉框的实现例子
    C#装箱与拆箱
    在VS2005连接SQL2005时不允许远程连接
    联系我们
  • 原文地址:https://www.cnblogs.com/Alex80/p/11541476.html
Copyright © 2011-2022 走看看