参考: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, , toEncryptArray.Length);
tdes.Clear();
return Convert.ToBase64String(resultArray, , 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, , 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, , toEncryptArray.Length);
tdes.Clear(); return Convert.ToBase64String(resultArray, , 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, , 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,,); //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, , ); //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();
}

TripleDES加密解密的更多相关文章

  1. TripleDES之C#和PHP之间加密解密

    在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES. DES和TripleDES之间的关系可以参考下面的博文. 对称加密D ...

  2. TripleDES对称加密解密 -[C#-JAVA]

    C#代码段 先MD5 再TripleDES加密 using System;using System.Collections.Generic;using System.Linq;using System ...

  3. .Net中的加密解密

    返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...

  4. 【代码笔记】iOS-3DES+Base64加密解密

    一,工程目录. 二,代码. RootViewController.m #import "RootViewController.h" #import "NSString+T ...

  5. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  6. C#做的一个加密/解密的类

    转自:http://www.16aspx.com/Article/3904 using System; using System.Security.Cryptography; using System ...

  7. .NET下的加密解密大全(2):对称加密

    本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. 公共代码[csharp]static byte[] CreateKey(int num) {     byt ...

  8. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  9. jquery实现登录加密的几种方法以及cookie存放加密/解密

    本篇文章的所有操作都是在jsp页面上进行的,完全与后台分离 part 1:加密方式 这个加密方式网上基本都有很多人总结,我在此也就抛砖引玉一下: 1.base64加密 在页面中引入base64.js文 ...

随机推荐

  1. servlet入门学习之Web容器

    一.web服务器 web服务器(程序/软件) 即:www服务器或http服务器.提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.向浏览器提供服务的程序. 1.Web服务器是指 ...

  2. 前端css常用class命名id命名

    1.常用id的命名: (1)页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sideba ...

  3. 自定义jstl fn函数fns

    1.引入函数声明: jsp页面需要引入自定义fns函数声明:<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld&q ...

  4. 使用Recovery Services备份Azure ARM模式虚拟机

    1.需要事先准备好要备份的虚拟机,如"hlmcent73n" 2.创建一个恢复服务保管库 3.选择虚拟机类型的备份 4.可以选择默认备份策略,也可以选择新建备份策略,以下演示为新建 ...

  5. nginx服务器的作用与简单搭建(windows)

    Nginx是一款开源代码的反向代理服务器. 何为反向代理呢?即以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连 ...

  6. 20165220 学习基础和C语言基础调查

    # # # # 我觉得我打游戏(不知道算不算一技之长)毕竟从小学一年级就接触到了各种形形色色的游戏,讲道理其实我的游戏天赋毕竟还是很大的,从意识到感觉我觉得都比大多数人好一些,其实吧打游戏打得好也是很 ...

  7. JUnit5 技术前瞻

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6868495.html   JUnit ...

  8. ImageMagick命令行工具

    [ convert | identify | mogrify | composite | montage | compare | display | animate | import |conjure ...

  9. Swing小技巧总结

    1. 使JDialog位于屏幕的中央 public void setToScreenCenter(JDialog jd) {           Dimension screenSize = Tool ...

  10. HDU [1529] || POJ [P1275] Cashier Employment

    经典的差分约束+二分答案. 本题的难点在于如何建图. 设x[i] 表示第i个小时可以开始工作的有多少个人. num[i] 表示第i个小时最少需雇佣多少人. s[i] 表示1...i小时实际开始工作的有 ...