參考: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 hash string sourceKey = "home"; //獲取原始key值的 md5 hash byte[] 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(); }