AES与RSA联合使用进行加解密(C#)

  • AES(对称加密)与RSA(非对称加密)联合使用示例及步骤(A请求B的某个页面):
  1.  A端生成AES密钥
  2.  B端生成RSA公钥和私钥,并将公钥给A
  3. A使用自己的AES密钥对自己的私密信息进行加密,并使用B提供的公钥对AES密钥进行加密,然后将请求信息和加密后的AES密钥发送给B
  4. B使用RSA私钥对加密的AES密钥进行解密,然后用AES密钥对A的请求信息进行解密
  5. B验证A的请求信息,实现后续的验证
  • 为什么联合使用AES与RSA加密算法
  1. AES是对称加密算法,在传输过程中容易被窃取,但加密效率高
  2. RSA是非对称加密算法,安全性高,但加密效率低
  3. RSA公钥加密的内容,只有对应的私钥才能解密,对于较长的内容,可以选择使用AES加密,然后用公钥加密AES密钥的方式进行加密。
  • C#对应的加解密方法
  1. 1  AES生成密钥、加解密
public class AESUtil
{
    //生成AES密钥
    public static Aes GenerateAES()
    {
        Aes aes=Aes.Create();
        return aes;
    }
    //获取AES密钥
    public static byte[] GetAESKey(Aes aes)
    {
        byte[] key = aes.Key;
        return key;
    }
    //使用AES加密数据
    public static string AESEncript(string data, byte[] aesKey)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = aesKey;
            aes.IV = new byte[16];
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key,aes.IV);
            using (MemoryStream ms=new MemoryStream())
            {
                using (CryptoStream cs=new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw=new StreamWriter(cs))
                    {
                        sw.Write(data);
                    }
                }
                return Convert.ToBase64String(ms.ToArray());
            }
        }
    }
    //使用AES解密数据
    public static string AESDecript(string data,byte[] aesKey)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = aesKey;
            aes.IV=new byte[16];
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key,aes.IV);
            using (MemoryStream ms =new MemoryStream(Convert.FromBase64String(data)))
            {
                using (CryptoStream cs=new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr=new StreamReader(cs))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}
  1. 2  RSA密钥生成、加解密
public class RSAUtil
{
    //生成RSA密钥对
    public static RSA GenerateRSA()
    {
        RSA rsa=RSA.Create(2048);
        return rsa;
    }
    //获取公钥
    public static byte[] GetRSAPublicKey(RSA rsa)
    {
        var publicKey = rsa.ExportRSAPublicKey();  //导出当前密钥的公钥部分
        return publicKey;
    }
    //获取私钥
    public static byte[] GetRSAPrivateKey(RSA rsaKeyPair)
    {
        var privateKey = rsaKeyPair.ExportRSAPrivateKey();//导出当前密钥的私钥部分
        return privateKey;
    }
    //公钥加密
    public static byte[] RSAEncrypt(byte[] data,byte[] publicKey)
    {
        using (RSA rsa = RSA.Create())
        {
            rsa.ImportRSAPublicKey(publicKey,out int bytesRead);//导入公钥,从 PKCS#1 RSAPublicKey 结构中导入公钥
            return rsa.Encrypt(data,RSAEncryptionPadding.Pkcs1);//加密,RSAEncryptionPadding.Pkcs1:加密标准
        }
    }
    //私钥解密
    public static byte[] RSADecrypt(byte[] data, byte[] privateKey)
    {
        using (RSA rsa = RSA.Create())
        {
            rsa.ImportRSAPrivateKey(privateKey,out int bytesRead);
            return rsa.Decrypt(data, RSAEncryptionPadding.Pkcs1);
        }
    }
}
  1. 3  AES与RSA联合使用实现加解密
//生成AES密钥
Aes aes = AESUtil.GenerateAES();
byte[] aesKey = AESUtil.GetAESKey(aes);
//用AES密钥对信息加密
string enCryptInfo = AESUtil.AESEncript(userInfo, aesKey);
//用公钥对AES密钥加密
byte[] enCryptAESByRSA = RSAUtil.RSAEncrypt(aesKey, rsaPublicKey);
//用私钥对加密的AES解密
byte[] deCryptAESByRSA = RSAUtil.RSADecrypt(enCryptAESByRSA, rsaPrivateKey);
//用AES对加密信息解密
string deCryptInfo = AESUtil.AESDecript(enCryptInfo, deCryptAESByRSA);

你可能感兴趣的:(c#,安全)