【區塊鏈】(四)之常見的加密算法

我們經常在諜戰片裏看到,我軍傳遞情報用電報發送,但敵人也可以截取電報,這就需要對電報發送的內容進行加密,當時常用的加密方式是通過一段密文,對情報進行加密,比如說是當天的日報。這種屬於對稱加密,差不多是DES加密算法。這裏簡單介紹幾種。

 

 

主要介紹這幾種

需要注意的是,不可逆的不代表真的不可逆。

(1)MD5

 

Message Digest Algorithm MD5(中文名爲消息摘要算法第五版)爲計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。

 

 

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算爲另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即僞造數據)是非常困難的。

 

 

MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。

MD5爲不可逆的加密方式一般用作密碼驗證,當密碼加密結果一致時則認爲登陸成功;

public class MD5
{
    public string MD5Encrypt(string normalTxt)
    {
        var bytes = Encoding.Default.GetBytes(normalTxt);//求Byte[]數組
        var Md5 = new MD5CryptoServiceProvider().ComputeHash(bytes);//求哈希值
        return Convert.ToBase64String(Md5);//將Byte[]數組轉爲淨荷明文(其實就是字符串)
    }
}

(2)SHA

安全散列算法(英語:Secure Hash Algorithm,縮寫爲SHA)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。

    public class SHA//SHA爲不可逆加密方式
    {
        public string SHA1Encrypt(string normalTxt)
        {
            var bytes = Encoding.Default.GetBytes(normalTxt);
            var SHA = new SHA1CryptoServiceProvider();
            var encryptbytes = SHA.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public string SHA256Encrypt(string normalTxt)
        {
            var bytes = Encoding.Default.GetBytes(normalTxt);
            var SHA256 = new SHA256CryptoServiceProvider();
            var encryptbytes = SHA256.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public string SHA384Encrypt(string normalTxt)
        {
            var bytes = Encoding.Default.GetBytes(normalTxt);
            var SHA384 = new SHA384CryptoServiceProvider();
            var encryptbytes = SHA384.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public string SHA512Encrypt(string normalTxt)
        {
            var bytes = Encoding.Default.GetBytes(normalTxt);
            var SHA512 = new SHA512CryptoServiceProvider();
            var encryptbytes = SHA512.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
    }

 

(3)DES

DES全稱爲Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法,1977年被美國聯邦政府的國家標準局確定爲聯邦資料處理標準(FIPS),並授權在非密級政府通信中使用,隨後該算法在國際上廣泛流傳開來。需要注意的是,在某些文獻中,作爲算法的DES稱爲數據加密算法(Data Encryption Algorithm,DEA),已與作爲標準的DES區分開來。

public class DES
    {
        public DES(byte[] keyvi)//密鑰向量,8位就好了例如new byte[]{0x01,0x02,0x03,0x04,0x05,0x05,0x07}
        {
            this.keyvi = keyvi;
        }
        private byte[] keyvi;
        public string DesEncrypt(string normalTxt,string EncryptKey)
        {
           var bytes= Encoding.Default.GetBytes(normalTxt);
            var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
            using (MemoryStream ms=new MemoryStream())
            {
                var encry = new DESCryptoServiceProvider();
                CryptoStream cs = new CryptoStream(ms,encry.CreateEncryptor(key, keyvi),CryptoStreamMode.Write);
                cs.Write(bytes,0,bytes.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());
            }
        }
        public string DesDecrypt(string securityTxt, string EncryptKey)//解密
        {
            try
            {
                var bytes= Convert.FromBase64String(securityTxt);
                var key = Encoding.UTF8.GetBytes(EncryptKey.PadLeft(8, '0').Substring(0, 8));
                using (MemoryStream ms = new MemoryStream())
                {
                    var descrypt = new DESCryptoServiceProvider();
                    CryptoStream cs = new CryptoStream(ms, descrypt.CreateDecryptor (key, keyvi), CryptoStreamMode.Write);
                    cs.Write(bytes,0,bytes.Length);
                    cs.FlushFinalBlock();
                    return Encoding.UTF8.GetString(ms.ToArray());
                }
 
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }
    }

 

(4)AES

 

高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日發佈於FIPS PUB 197,並在2002年5月26日成爲有效的標準。2006年,高級加密標準已然成爲對稱密鑰加密中最流行的算法之一。

 public class AES
    {
        public AES(byte[] iv)
        {
            this.iv = iv;
        }
        byte[] iv;
        public string AESEncrypt(string normalTxt,string key)
        {
            var bytes = Encoding.Default.GetBytes(normalTxt);
            SymmetricAlgorithm des =Rijndael.Create();
            des.Key = Encoding.Default.GetBytes(key);
            des.IV = iv;
            using (MemoryStream ms=new MemoryStream())
            {
                CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);
                cs.Write(bytes, 0, bytes.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());
            }
        }
        public string AESDecrypt(string securityTxt, string key)
        {
            try
            {
                var bytes = Convert.FromBase64String(securityTxt);
                SymmetricAlgorithm des = Rijndael.Create();
                des.Key = Encoding.Default.GetBytes(key);
                des.IV = iv;
                using (MemoryStream ms = new MemoryStream())
                {
                    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                    cs.Write(bytes, 0, bytes.Length);
                    cs.FlushFinalBlock();
                    return Convert.ToBase64String(ms.ToArray());
                }
            }
            catch (Exception)
            {
                return string.Empty;
            }
 
        }
    }

 

 

 

(5)RSA

 

RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的。

1973年,在英國政府通訊總部工作的數學家克利福德·柯克斯(Clifford Cocks)在一個內部文件中提出了一個相同的算法,但他的發現被列入機密,一直到1997年才被髮表。

對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。假如有人找到一種快速因數分解的算法的話,那麼用RSA加密的信息的可靠性就肯定會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA鑰匙纔可能被強力方式解破。到目前爲止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。

1983年麻省理工學院在美國爲RSA算法申請了專利。這個專利2000年9月21日失效。由於該算法在申請專利前就已經被髮表了,在世界上大多數其它地區這個專利權不被承認。

RSA需要兩把密鑰,一個public key進行加密,一個private key用來解密。也可稱爲公鑰,私鑰。 

加密:

        public string RSAEncrypt(string normaltxt)
        {
            var bytes = Encoding.Default.GetBytes(normaltxt);
            var encryptBytes= new RSACryptoServiceProvider(new CspParameters()).Encrypt(bytes,false);
            return Convert.ToBase64String(encryptBytes);
        }

解密:

        public string RSADecrypt(string securityTxt)
        {
            try//必須使用Try catch,不然輸入的字符串不是淨荷明文程序就Gameover了
            {
               var bytes= Convert.FromBase64String(securityTxt);
               var DecryptBytes =new RSACryptoServiceProvider(new CspParameters()).Decrypt(bytes,false);
               return Encoding.Default.GetString(DecryptBytes);
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章