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

电玩女神 2022-07-15 07:58 275阅读 0赞

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

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

RSA 加密

  1. public string RsaEncrypt(string rawInput, string publicKey)
  2. {
  3. if (string.IsNullOrEmpty(rawInput))
  4. {
  5. return string.Empty;
  6. }
  7. if(string.IsNullOrWhiteSpace(publicKey))
  8. {
  9. throw new ArgumentException("Invalid Public Key");
  10. }
  11. using (var rsaProvider = new RSACryptoServiceProvider())
  12. {
  13. var inputBytes = Encoding.UTF8.GetBytes(rawInput);//有含义的字符串转化为字节流
  14. rsaProvider.FromXmlString(publicKey);//载入公钥
  15. int bufferSize = (rsaProvider.KeySize / 8) - 11;//单块最大长度
  16. var buffer = new byte[bufferSize];
  17. using (MemoryStream inputStream = new MemoryStream(inputBytes),
  18. outputStream = new MemoryStream())
  19. {
  20. while (true)
  21. { //分段加密
  22. int readSize = inputStream.Read(buffer, 0, bufferSize);
  23. if (readSize <= 0)
  24. {
  25. break;
  26. }
  27. var temp = new byte[readSize];
  28. Array.Copy(buffer, 0, temp, 0, readSize);
  29. var encryptedBytes = rsaProvider.Encrypt(temp, false);
  30. outputStream.Write(encryptedBytes, 0, encryptedBytes.Length);
  31. }
  32. return Convert.ToBase64String(outputStream.ToArray());//转化为字节流方便传输
  33. }
  34. }
  35. }

RSA 解密

  1. public string RsaDecrypt(string encryptedInput, string privateKey)
  2. {
  3. if (string.IsNullOrEmpty(encryptedInput))
  4. {
  5. return string.Empty;
  6. }
  7. if (string.IsNullOrWhiteSpace(privateKey))
  8. {
  9. throw new ArgumentException("Invalid Private Key");
  10. }
  11. using (var rsaProvider = new RSACryptoServiceProvider())
  12. {
  13. var inputBytes = Convert.FromBase64String(encryptedInput);
  14. rsaProvider.FromXmlString(privateKey);
  15. int bufferSize = rsaProvider.KeySize / 8;
  16. var buffer = new byte[bufferSize];
  17. using (MemoryStream inputStream = new MemoryStream(inputBytes),
  18. outputStream = new MemoryStream())
  19. {
  20. while (true)
  21. {
  22. int readSize = inputStream.Read(buffer, 0, bufferSize);
  23. if (readSize <= 0)
  24. {
  25. break;
  26. }
  27. var temp = new byte[readSize];
  28. Array.Copy(buffer, 0, temp, 0, readSize);
  29. var rawBytes = rsaProvider.Decrypt(temp, false);
  30. outputStream.Write(rawBytes, 0, rawBytes.Length);
  31. }
  32. return Encoding.UTF8.GetString(outputStream.ToArray());
  33. }
  34. }
  35. }

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 RSA加密解密

    RSA加密与解密 RSA算法的密钥由公钥和私钥组成,公钥用于加密,私钥用于解密。顾名思义,公钥就是可以进行公开的密钥,一般可以公开给你的合作伙伴;私钥就是私有的,也就是只

    相关 JS-RSA加密解密

      在上一篇文章《Java使用RSA加密解密签名及校验》中,用java实现加密解密,但是在实际应用中,如前端页面用户输入的密码传输给后台服务前,需加密,也就是公钥加密,私钥解密