非对称加密RSA的C#实现

Posted 小台的IT备忘录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非对称加密RSA的C#实现相关的知识,希望对你有一定的参考价值。

1.对称加密算法

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。

对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥,

一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,

不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。

密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

常用对称加密:DES、3DES、AES等

(代码后续添加)

 

2.非对称加密算法

非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。

私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。

与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

常用非对称加密:DSA、RSA等

目前C#中提供的RSA非对称加密(其他语言如JAVA是可以逆向加解密的,但没有测试过),只能使用公钥进行加密,只能使用私钥进行解密,不能逆向使用(私钥无法加密,公钥无法解密),

因为这样的安全性更高,不会出现私钥加密后的数据,所有公钥持有者都可以解密的问题,如果一定要有这种需求出现,则可以使用

第三方的加解密组件BouncyCastle来实现

//引入命名空间
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;


//RSA测试实例
string oldData = "taiyonghai";
CreateRSAKey();
string ciphertext = RSAEncrypt(oldData);
string newData = RSADecrypt(ciphertext);


/// <summary>
/// 创建RSA公钥私钥
/// </summary>
public void CreateRSAKey()
{
    //设置[公钥私钥]文件路径
    string privateKeyPath = @"d:\\PrivateKey.xml";
    string publicKeyPath = @"d:\\PublicKey.xml";
    //创建RSA对象
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    //生成RSA[公钥私钥]
    string privateKey = rsa.ToXmlString(true);
    string publicKey = rsa.ToXmlString(false);
    //将密钥写入指定路径
    File.WriteAllText(privateKeyPath, privateKey);//文件内包含公钥和私钥
    File.WriteAllText(publicKeyPath, publicKey);//文件内只包含公钥
}
/// <summary>
/// 使用RSA实现加密
/// </summary>
/// <param name="data">加密数据</param>
/// <returns></returns>
public string RSAEncrypt(string data)
{
    //C#默认只能使用[公钥]进行加密(想使用[公钥解密]可使用第三方组件BouncyCastle来实现)
    string publicKeyPath = @"d:\\PublicKey.xml";
    string publicKey = File.ReadAllText(publicKeyPath);
    //创建RSA对象并载入[公钥]
    RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider();
    rsaPublic.FromXmlString(publicKey);
    //对数据进行加密
    byte[] publicValue = rsaPublic.Encrypt(Encoding.UTF8.GetBytes(data), false);
    string publicStr = Convert.ToBase64String(publicValue);//使用Base64将byte转换为string
    return publicStr;
}
/// <summary>
/// 使用RSA实现解密
/// </summary>
/// <param name="data">解密数据</param>
/// <returns></returns>
public string RSADecrypt(string data)
{
    //C#默认只能使用[私钥]进行解密(想使用[私钥加密]可使用第三方组件BouncyCastle来实现)
    string privateKeyPath = @"d:\\PrivateKey.xml";
    string privateKey = File.ReadAllText(privateKeyPath);
    //创建RSA对象并载入[私钥]
    RSACryptoServiceProvider rsaPrivate = new RSACryptoServiceProvider();
    rsaPrivate.FromXmlString(privateKey);
    //对数据进行解密
    byte[] privateValue = rsaPrivate.Decrypt(Convert.FromBase64String(data), false);//使用Base64将string转换为byte
    string privateStr = Encoding.UTF8.GetString(privateValue);
    return privateStr;
}

 

附录:

在线加解密站点:http://web.chacuo.net/netrsakeypair

以上是关于非对称加密RSA的C#实现的主要内容,如果未能解决你的问题,请参考以下文章

基于C#的RSA非对称加密算法

Python使用rsa模块实现非对称加密与解密

非对称加密的RSA算法如何通过golang来实现?

.NET Core加解密实战系列之——RSA非对称加密算法

非对称加密及RSA加密算法

Go语言实现对称加密算法AESDES3DES和非对称加密算法RSA