C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider
DESCryptoServiceProvider 是用於對稱加密 RSACryptoServiceProvider是用於非對稱加密
對稱加密:
對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發信方將明文(原始數據)和加密密鑰一起經過特殊加密算法處理后,使其變成復雜的加密密文發送出去。收信方收到密文后,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。
非對稱加密:
不對稱加密算法使用兩把完全不同但又是完全匹配的一對鑰匙—公鑰和私鑰。在使用不對稱加密算法加密文件時,只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。加密明文時采用公鑰加密,解密密文時使用私鑰才能完成,而且發信方(加密者)知道收信方的公鑰,只有收信方(解密者)才是唯一知道自己私鑰的人。不對稱加密算法的基本原理是,如果發信方想發送只有收信方才能解讀的加密信息,發信方必須首先知道收信方的公鑰,然后利用收信方的公鑰來加密原文;收信方收到加密密文后,使用自己的私鑰才能解密密文。顯然,采用不對稱加密算法,收發信雙方在通信之前,收信方必須將自己早已隨機生成的公鑰送給發信方,而自己保留私鑰。
數字簽名:數字簽名的意義就是這些數據與原文數據比對是否修改過。一般是用自己的私鑰對數據進行簽名,然后用公鑰去驗證這個數據是否修改過
1、用RSACryptoServiceProvider 加密解密
//加密解密用到的公鑰與私鑰
RSACryptoServiceProvider oRSA = new RSACryptoServiceProvider();
string privatekey=oRSA.ToXmlString(true);//私鑰
string publickey=oRSA.ToXmlString(false);//公鑰
//這兩個密鑰需要保存下來
byte[] messagebytes = Encoding.UTF8.GetBytes("luo羅"); //需要加密的數據
-
//公鑰加密
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider();
oRSA1.FromXmlString(publickey); //加密要用到公鑰所以導入公鑰
byte[] AOutput = oRSA1.Encrypt(messagebytes ,false); //AOutput 加密以后的數據
-
//私鑰解密
RSACryptoServiceProvider oRSA2 = new RSACryptoServiceProvider();
oRSA2.FromXmlString(privatekey);
byte[] AInput = oRSA2.Decrypt(AOutput, false);
string reslut=Encoding.ASCII.GetString(AInput)
2、用RSACryptoServiceProvider簽名驗簽
byte[] messagebytes = Encoding.UTF8.GetBytes("luo羅");
RSACryptoServiceProvider oRSA = new RSACryptoServiceProvider();
string privatekey = oRSA.ToXmlString(true);
string publickey = oRSA.ToXmlString(false);
//私鑰簽名
RSACryptoServiceProvider oRSA3 = new RSACryptoServiceProvider();
oRSA3.FromXmlString(privatekey);
byte[] AOutput = oRSA3.SignData(messagebytes, "SHA1");
//公鑰驗證
RSACryptoServiceProvider oRSA4 = new RSACryptoServiceProvider();
oRSA4.FromXmlString(publickey);
bool bVerify = oRSA4.VerifyData(messagebytes, "SHA1", AOutput);
3、用證書進行簽名
因為一般證書的私鑰是不可以導出的所以所以用第2種方法導入私鑰的來進行簽名行不通
byte[] messagebytes = Encoding.UTF8.GetBytes("luo羅");
string Path = @"D:\Certificate\1.P12";
X509Certificate2 x509 = new X509Certificate2(Path, "12345678");
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] hashbytes = sha1.ComputeHash(messagebytes); //對要簽名的數據進行哈希
RSAPKCS1SignatureFormatter signe = new RSAPKCS1SignatureFormatter();
signe.SetKey(x509.PrivateKey); //設置簽名用到的私鑰
signe.SetHashAlgorithm("SHA1"); //設置簽名算法
byte[] reslut = signe.CreateSignature(hashbytes);
驗簽:與第2方法相同
RSACryptoServiceProvider oRSA4 = new RSACryptoServiceProvider();
oRSA4.FromXmlString(x509.PublicKey.Key.ToXmlString(false));
bool bVerify = oRSA4.VerifyData(messagebytes, "SHA1", reslut);
4、用證書加密解密
string Path = @"D:\Certificate\1.P12";
X509Certificate2 x509 = new X509Certificate2(Path, "12345678");
byte[] data = System.Text.Encoding.UTF8.GetBytes("cheshi羅");
-
//證書公鑰加密
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider();
oRSA1.FromXmlString(x509.PublicKey.Key.ToXmlString(false));
-
byte[] AOutput = oRSA1.Encrypt(data, false);
-
//證書私鑰解密
RSACryptoServiceProvider rsa2 = (RSACryptoServiceProvider)x509.PrivateKey;
byte[] plainbytes = rsa2.Decrypt(AOutput, false);
string reslut = Encoding.UTF8.GetString(plainbytes);
5用證書對文件加密解密,因為文件可能特別大 所以需要用流和buffer的方式來,鄙視把文件全部讀到byte[]里進行加密的人,假如文件5G,那全部讀到byte[]里崩潰掉
private void Form1_Load(object sender, EventArgs e)
{
x509=new X509Certificate2(Path, "12345678");
RSACryptoServiceProvider oRSA1 = new RSACryptoServiceProvider();
Encrypt();
Decrypt();
}
private void Decrypt()
{
string FilePath = "2.txt";
string OutFile = "3.txt";
