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

 

posted @ 2017-12-20 14:56  ice.ko  阅读(5930)  评论(2编辑  收藏  举报