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 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();
}

 


免責聲明!

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



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