C# 实现RSA AES加密解密
RAS:
C# System.Security.Cryptography 提供了base64和xmlstring两种方式,我更喜欢base64的
RSA是非对称加密,经典的对称加密就是DES,AES等,不过这两种算法的缺点是加解密双方都必须知道密钥,安全性不高
RSA则可以解决这个问题,生成公钥和私钥,公钥可以公开给其他人,私钥自己保管,别人用公钥加密后,自己用私钥解密。
RSA代码如下:
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Windows;
namespace RSA
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
RSAUtil rsaInstance = new RSAUtil();
var dictK = rsaInstance.GetKey();
string strText = "aaabbbcc";
Console.WriteLine("要加密的字符串是:{0}", strText);
string str1 = rsaInstance.Encrypt(strText, dictK["PublicKey"]);
Console.WriteLine("加密后的字符串:{0}", str1);
string str2 = rsaInstance.Decrypt(str1, dictK["PrivateKey"]);
Console.WriteLine("解密后的字符串:{0}", str2);
}
}
public class RSAUtil
{
/// <summary>
/// 使用公钥加密
/// </summary>
/// <returns></returns>
public string Encrypt(string strText, string strPublicKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(Convert.FromBase64String(strPublicKey));
byte[] byteText = Encoding.UTF8.GetBytes(strText);
byte[] byteEntry = rsa.Encrypt(byteText, false);
return Convert.ToBase64String(byteEntry);
}
/// <summary>
/// 私钥解密
/// </summary>
/// <param name="strEntryText"></param>
/// <param name="strPrivateKey"></param>
/// <returns></returns>
public string Decrypt(string strEntryText, string strPrivateKey)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(Convert.FromBase64String(strPrivateKey));
byte[] byteEntry = Convert.FromBase64String(strEntryText);
byte[] byteText = rsa.Decrypt(byteEntry, false);
return Encoding.UTF8.GetString(byteText);
}
/// <summary>
/// 获取公钥和私钥
/// </summary>
/// <returns></returns>
public Dictionary<string, string> GetKey()
{
Dictionary<string, string> dictKey = new Dictionary<string, string>();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
string public_Key = Convert.ToBase64String(rsa.ExportCspBlob(false));
string private_Key = Convert.ToBase64String(rsa.ExportCspBlob(true));
dictKey.Add("PublicKey", public_Key);
dictKey.Add("PrivateKey", private_Key);
return dictKey;
}
}
}
AES代码如下:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace AEStest
{
class Program
{
//为什么要用base64,因为得到的密文是byte[],所以默认用base64转成str方便查看
static void Main(string[] args)
{
string password = "abcAE#$M&*987";
Console.WriteLine($"原始密码为:{password} ");
string key = "1234567890qwerty";//16字节,128位
var EncryptStr = Encrypt(key, password);
Console.WriteLine($"使用密钥:{key} 为原密码:{password} 加密");
Console.WriteLine($"得到密文:{EncryptStr}");
Console.WriteLine($"使用密钥:{key} 为密文:{EncryptStr} 解密");
var realPwd = Decrypt(key, EncryptStr);
Console.WriteLine($"得到原密码:{realPwd}");
}
// AES 加密的初始化向量,加密解密需设置相同的值。默认值我们设置成 16 个 0
public static byte[] AES_IV = Encoding.UTF8.GetBytes("0000000000000000");
// AES的key支持128位,最大支持256位。256位需要32个字节。
// 所以这里使用密钥的前 32 字节作为 key ,不足32补 0。
public static byte[] GetKey(string pwd)
{
while (pwd.Length < 32)
{
pwd += '0';
}
pwd = pwd.Substring(0, 32);
return Encoding.UTF8.GetBytes(pwd);
}
/// <summary>
/// 加密
/// </summary>
/// <param name="key">密钥</param>
/// <param name="password">要被加密的原始密码</param>
/// <returns>密文base64</returns>
public static string Encrypt(string key, string password)
{
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = GetKey(key);
aesAlg.IV = AES_IV;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(password);
}
byte[] bytes = msEncrypt.ToArray();
return Convert.ToBase64String(bytes);
}
}
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="key">密钥</param>
/// <param name="EncryptStr">密文</param>
/// <returns>明文-原密码</returns>
public static string Decrypt(string key, string EncryptStr)
{
byte[] inputBytes = Convert.FromBase64String(EncryptStr);
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
{
aesAlg.Key = GetKey(key);
aesAlg.IV = AES_IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srEncrypt = new StreamReader(csEncrypt))
{
return srEncrypt.ReadToEnd();
}
}
}
}
}
}
}
AES加解密,不同语言之间,需要对上AES的模式,密钥,向量, 编码格式
还没有评论,来说两句吧...