C# 实现RSA AES加密解密

深藏阁楼爱情的钟 2023-05-30 06:08 76阅读 0赞

RAS:

C# System.Security.Cryptography 提供了base64和xmlstring两种方式,我更喜欢base64的

RSA是非对称加密,经典的对称加密就是DES,AES等,不过这两种算法的缺点是加解密双方都必须知道密钥,安全性不高

RSA则可以解决这个问题,生成公钥和私钥,公钥可以公开给其他人,私钥自己保管,别人用公钥加密后,自己用私钥解密。

RSA代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. using System.Windows;
  6. namespace RSA
  7. {
  8. public partial class MainWindow : Window
  9. {
  10. public MainWindow()
  11. {
  12. InitializeComponent();
  13. RSAUtil rsaInstance = new RSAUtil();
  14. var dictK = rsaInstance.GetKey();
  15. string strText = "aaabbbcc";
  16. Console.WriteLine("要加密的字符串是:{0}", strText);
  17. string str1 = rsaInstance.Encrypt(strText, dictK["PublicKey"]);
  18. Console.WriteLine("加密后的字符串:{0}", str1);
  19. string str2 = rsaInstance.Decrypt(str1, dictK["PrivateKey"]);
  20. Console.WriteLine("解密后的字符串:{0}", str2);
  21. }
  22. }
  23. public class RSAUtil
  24. {
  25. /// <summary>
  26. /// 使用公钥加密
  27. /// </summary>
  28. /// <returns></returns>
  29. public string Encrypt(string strText, string strPublicKey)
  30. {
  31. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  32. rsa.ImportCspBlob(Convert.FromBase64String(strPublicKey));
  33. byte[] byteText = Encoding.UTF8.GetBytes(strText);
  34. byte[] byteEntry = rsa.Encrypt(byteText, false);
  35. return Convert.ToBase64String(byteEntry);
  36. }
  37. /// <summary>
  38. /// 私钥解密
  39. /// </summary>
  40. /// <param name="strEntryText"></param>
  41. /// <param name="strPrivateKey"></param>
  42. /// <returns></returns>
  43. public string Decrypt(string strEntryText, string strPrivateKey)
  44. {
  45. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  46. rsa.ImportCspBlob(Convert.FromBase64String(strPrivateKey));
  47. byte[] byteEntry = Convert.FromBase64String(strEntryText);
  48. byte[] byteText = rsa.Decrypt(byteEntry, false);
  49. return Encoding.UTF8.GetString(byteText);
  50. }
  51. /// <summary>
  52. /// 获取公钥和私钥
  53. /// </summary>
  54. /// <returns></returns>
  55. public Dictionary<string, string> GetKey()
  56. {
  57. Dictionary<string, string> dictKey = new Dictionary<string, string>();
  58. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  59. string public_Key = Convert.ToBase64String(rsa.ExportCspBlob(false));
  60. string private_Key = Convert.ToBase64String(rsa.ExportCspBlob(true));
  61. dictKey.Add("PublicKey", public_Key);
  62. dictKey.Add("PrivateKey", private_Key);
  63. return dictKey;
  64. }
  65. }
  66. }

AES代码如下:

  1. using System;
  2. using System.IO;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. namespace AEStest
  6. {
  7. class Program
  8. {
  9. //为什么要用base64,因为得到的密文是byte[],所以默认用base64转成str方便查看
  10. static void Main(string[] args)
  11. {
  12. string password = "abcAE#$M&*987";
  13. Console.WriteLine($"原始密码为:{password} ");
  14. string key = "1234567890qwerty";//16字节,128位
  15. var EncryptStr = Encrypt(key, password);
  16. Console.WriteLine($"使用密钥:{key} 为原密码:{password} 加密");
  17. Console.WriteLine($"得到密文:{EncryptStr}");
  18. Console.WriteLine($"使用密钥:{key} 为密文:{EncryptStr} 解密");
  19. var realPwd = Decrypt(key, EncryptStr);
  20. Console.WriteLine($"得到原密码:{realPwd}");
  21. }
  22. // AES 加密的初始化向量,加密解密需设置相同的值。默认值我们设置成 16 个 0
  23. public static byte[] AES_IV = Encoding.UTF8.GetBytes("0000000000000000");
  24. // AES的key支持128位,最大支持256位。256位需要32个字节。
  25. // 所以这里使用密钥的前 32 字节作为 key ,不足32补 0。
  26. public static byte[] GetKey(string pwd)
  27. {
  28. while (pwd.Length < 32)
  29. {
  30. pwd += '0';
  31. }
  32. pwd = pwd.Substring(0, 32);
  33. return Encoding.UTF8.GetBytes(pwd);
  34. }
  35. /// <summary>
  36. /// 加密
  37. /// </summary>
  38. /// <param name="key">密钥</param>
  39. /// <param name="password">要被加密的原始密码</param>
  40. /// <returns>密文base64</returns>
  41. public static string Encrypt(string key, string password)
  42. {
  43. using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
  44. {
  45. aesAlg.Key = GetKey(key);
  46. aesAlg.IV = AES_IV;
  47. ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
  48. using (MemoryStream msEncrypt = new MemoryStream())
  49. {
  50. using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
  51. {
  52. using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
  53. {
  54. swEncrypt.Write(password);
  55. }
  56. byte[] bytes = msEncrypt.ToArray();
  57. return Convert.ToBase64String(bytes);
  58. }
  59. }
  60. }
  61. }
  62. /// <summary>
  63. /// 解密
  64. /// </summary>
  65. /// <param name="key">密钥</param>
  66. /// <param name="EncryptStr">密文</param>
  67. /// <returns>明文-原密码</returns>
  68. public static string Decrypt(string key, string EncryptStr)
  69. {
  70. byte[] inputBytes = Convert.FromBase64String(EncryptStr);
  71. using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
  72. {
  73. aesAlg.Key = GetKey(key);
  74. aesAlg.IV = AES_IV;
  75. ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
  76. using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
  77. {
  78. using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
  79. {
  80. using (StreamReader srEncrypt = new StreamReader(csEncrypt))
  81. {
  82. return srEncrypt.ReadToEnd();
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. }

AES加解密,不同语言之间,需要对上AES的模式,密钥,向量, 编码格式

发表评论

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

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

相关阅读

    相关 Java实现AES加密解密

    之前常用两种加密算法:Base64和Md5,前者容易破解,后者不可逆。 AES采用对称加密方式,破解难度非常大,在可逆的基础上,能很好的保证数据的安全性。 这里介绍Java

    相关 AES+RSA加密

    AES+RSA加密 一、说明 加密算法分 对称加密、非对称加密、散列。其中对称加密算法的的密钥相同;非对称加密算法的加密密钥与解密的密钥不同;散列算法不需要密钥

    相关 C# AES 加密解密示例

    AES 是一种对称加密算法。 相对非对称加密,对称加密解密过程速度更快, 适合大数据流实时加密解密。AES 被广泛应用于金融,政府等领域的网络传输。在这里分享一段用 .Net