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, , 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加密解密的更多相关文章
- TripleDES之C#和PHP之间加密解密
在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES. DES和TripleDES之间的关系可以参考下面的博文. 对称加密D ...
- TripleDES对称加密解密 -[C#-JAVA]
C#代码段 先MD5 再TripleDES加密 using System;using System.Collections.Generic;using System.Linq;using System ...
- .Net中的加密解密
返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...
- 【代码笔记】iOS-3DES+Base64加密解密
一,工程目录. 二,代码. RootViewController.m #import "RootViewController.h" #import "NSString+T ...
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- C#做的一个加密/解密的类
转自:http://www.16aspx.com/Article/3904 using System; using System.Security.Cryptography; using System ...
- .NET下的加密解密大全(2):对称加密
本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. 公共代码[csharp]static byte[] CreateKey(int num) { byt ...
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...
- jquery实现登录加密的几种方法以及cookie存放加密/解密
本篇文章的所有操作都是在jsp页面上进行的,完全与后台分离 part 1:加密方式 这个加密方式网上基本都有很多人总结,我在此也就抛砖引玉一下: 1.base64加密 在页面中引入base64.js文 ...
随机推荐
- J.U.C JMM. pipeline.指令重排序,happen-before
pipeline: 现在的CPU一般采用流水线方式来执行指令.一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段.然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐 ...
- MySQL查询性能优化一则
公司有一套Web系统, 使用方反馈系统某些页面访问速度缓慢, 用户体验很差, 并且偶尔还会出现HTTP 502错误. 这是典型的服务器端IO阻塞引发的问题,通过对访问页面的程序逻辑进行跟踪,发现问题应 ...
- /dev/shm 引起的内存统计问题
最近,有个同事问我,怎么准确地描述linux系统到底还有多少内存可供我使用.这里不扯内存碎片问题,就说剩余总量. 如下: cat /proc/meminfo MemTotal: 263796812 k ...
- 图表工具--- ECharts.js学习(一) 简单入门
ECharts.js学习(一) 在项目开发的时候,在前端的数据需要用图表的形式展示.网上搜索了一下,发现有几种统计图库.具体有哪几种可以看: 前端开发者常用的9个JavaScript图表库 EChar ...
- JS题目
1.请你谈谈Cookie的弊端 cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的. 第一:每个特定的域名下最多生成20个cookie 1.IE6或更低版本最 ...
- SVN同步时忽略特定文件或文件夹
在MyEclipse中使用SVN同步的时候,经常会提示一些比如.classpath等不需要同步的配置文件,可以通过设置来忽略这一部分的文件或者文件夹. 1.选择菜单Window→Preferences ...
- Codeforces B. Divisiblity of Differences
B. Divisiblity of Differences time limit per test 1 second memory limit per test 512 megabytes input ...
- math对象与数组对象
1.math对象 属性 //PI 圆周率 方法 //random 随机数 var num= Math.random(); 生成0到1的随机数//round 四舍五入var num2 ...
- JS前端验证代码
手机号码正则表达式验证: function checkPhone(){ var phone = document.getElementById('phone').value; if(!(/^1[345 ...
- 创建github仓库的gh-pages分支
用git symbolic-ref命令将当前工作分支由master切换到一个尚不存在的分支gh-pages. $ git symbolic-ref HEAD refs/heads/gh-pages 删 ...