TripleDES加密解密
參考:http://www.cnblogs.com/chnking/archive/2007/08/14/855600.html
參考:http://blog.csdn.net/change_from_now/article/details/51705934
參考:http://www.cnblogs.com/pengze0902/p/6268709.html
對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,信息的發送者和信息的接收者在進行信息的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通信雙方都必須獲得這把鑰匙,并保持鑰匙的秘密。
單鑰密碼系統的安全性依賴于以下兩個因素:
第一、加密算法必須是足夠強的,僅僅基于密文本身去解密信息在實踐上是不可能的。
第二、加密方法的安全性依賴于密鑰的秘密性,而不是算法的秘密性,因此,我們沒有必要確保算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的算法都是公開的),但是我們一定要保證密鑰的秘密性。
DES(Data Encryption Standard)和TripleDES是對稱加密的兩種實現。
DES和TripleDES基本算法一致,只是TripleDES算法提供的key位數更多,加密可靠性更高。
DES使用的密鑰key為8字節,初始向量IV也是8字節。
TripleDES使用24字節的key,初始向量IV也是8字節。
兩種算法都是以8字節為一個塊進行加密,一個數據塊一個數據塊的加密,一個8字節的明文加密后的密文也是8字節。如果明文長度不為8字節的整數倍,添加值為0的字節湊滿8字節整數倍。所以加密后的密文長度一定為8字節的整數倍。
TripleDES加密:
/// <summary>/// TripleDES 加密/// </summary>/// <param name="toEncrypt"></param>/// <param name="privateKey"></param>/// <returns></returns>private static string DesEncrypt(string toEncrypt, string key) {var toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);var keyArray = Convert.FromBase64String(key);TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider {Key = keyArray,Mode = CipherMode.ECB,Padding = PaddingMode.PKCS7};ICryptoTransform cTransform = tdes.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);tdes.Clear();return Convert.ToBase64String(resultArray, 0, resultArray.Length);}
TripleDES解密:
/// <summary> /// TripleDES解密 /// </summary> /// <param name="toDecrypt"></param> /// <param name="privateKey"></param> /// <returns></returns> public static string DesDecrypt(string toDecrypt, string key) {try {//先base64解密 因為加密的時候最后走了一道base64加密var enBytes = Convert.FromBase64String(toDecrypt);var keyArray = Convert.FromBase64String(key);TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider {Key = keyArray,Mode = CipherMode.ECB,Padding = PaddingMode.PKCS7};ICryptoTransform cTransform = tdes.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(enBytes, 0, enBytes.Length);tdes.Clear();return Encoding.UTF8.GetString(resultArray);} catch {return "";} }?
c#具體實現如下:
using System; using System.Security.Cryptography; using System.Text;namespace TripleDes {class Program{static void Main(string[] args){//加密的字符串string source = "Happy Father's Day!";//用來加密的key 但是最終用在des加密的key//是這個key的 md5 hashstring sourceKey = "home";//獲取原始key值的 md5 hashbyte[] keyBytes = GetKeyMd5Hash(sourceKey);string encryptedStr = DesEncrypt(source, keyBytes);Console.WriteLine("encrypted string: "+ encryptedStr);string decryptedStr = DesDecrypt(encryptedStr, keyBytes);Console.WriteLine("Decrypted String: " + decryptedStr);Console.ReadKey();}/// <summary>/// 獲取加密key的 md5 hash,最終DES加密的時候使用這個hash值/// </summary>/// <param name="key">原始key值</param>/// <returns></returns>public static byte[] GetKeyMd5Hash(string key){MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();byte[] keyBytes = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));hashmd5.Clear();return keyBytes;}/// <summary>/// TripleDES 加密/// </summary>/// <param name="toEncrypt"></param>/// <param name="privateKey"></param>/// <returns></returns>public static string DesEncrypt(string toEncrypt, byte[] privateKey){byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider{Key = privateKey,Mode = CipherMode.ECB,Padding = PaddingMode.PKCS7};ICryptoTransform cTransform = tdes.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);tdes.Clear();return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// <summary>/// TripleDES解密/// </summary>/// <param name="toDecrypt"></param>/// <param name="privateKey"></param>/// <returns></returns>public static string DesDecrypt(string toDecrypt, byte[] privateKey){//先base64解密 因為加密的時候最后走了一道base64加密byte[] enBytes = Convert.FromBase64String(toDecrypt);TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider{Key = privateKey,Mode = CipherMode.ECB,Padding = PaddingMode.PKCS7};ICryptoTransform cTransform = tdes.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(enBytes, 0, enBytes.Length);tdes.Clear();return Encoding.UTF8.GetString(resultArray);}} }PHP實現如下:
<?php/*TripleDES加密 */ function DesEncrypt($data) { //Pad for PKCS7$blockSize = mcrypt_get_block_size('tripledes', 'ecb');$len = strlen($data);$pad = $blockSize - ($len % $blockSize);$data .= str_repeat(chr($pad), $pad);$key = "home";$key = md5($key,TRUE);$key .= substr($key,0,8); //comment this if you use 168 bits long key//Encrypt data$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); return base64_encode($encData); }/*TripleDES解密*/function DesDecrypt($data){$key = "home";$key = md5($key, TRUE);$key .= substr($key, 0, 8);//Decrypt data$fromBase64Str = base64_decode($data);$decData = mcrypt_decrypt('tripledes', $key, $fromBase64Str, 'ecb');return $decData;}/*測試*/$encryptStr = DesEncrypt("Happy Father's Day!"); echo "encrypted string: $encryptStr</br>";$decryptStr = DesDecrypt($encryptStr);echo "decrypted string: $decryptStr"; ?>?js加密:
function desEncrypt(str, key){key = CryptoJS.enc.Base64.parse(key);// Triple DES 加密var encrypted = CryptoJS.TripleDES.encrypt(str, key, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});// 轉換為字符串return encrypted = encrypted.toString(); }?
轉載于:https://www.cnblogs.com/miskis/p/8073692.html
總結
以上是生活随笔為你收集整理的TripleDES加密解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一阶段用户模板和场景
- 下一篇: CTF-练习平台-WEB之 签到题