C# RSACryptoServiceProvider加密解密簽名驗簽和DESCryptoServic


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"; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM