对称加密算法-DES以及DESede算法
一、简述
对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密。
DES是美国国家标准研究所提出的算法。因为加解密的数据安全性和密钥长度成正比。des的56位的密钥已经形成安全隐患,在1998年之后就很少被采用。但是一些老旧的系统还在使用。因为这个des算法并没有被美国标准委员会公布全部算法,大家一致怀疑被留了后门。所以慢慢就被淘汰掉了。
后来针对des算法进行了改进,有了三重des算法(DESede)。针对des算法的密钥长度较短以及迭代次数偏少问题做了相应改进,提高了安全强度。不过desede算法处理速度较慢,密钥计算时间较长,加密效率不高问题使得对称加密算法的发展不容乐观。
二、交互模型
1、消息传递双方约定密钥,通常由消息发送方(甲方)构建密钥通知消息接收方(乙方)
2、甲方使用密钥对数据记性加密,然后将加密后的数据通过网络传送给乙方
3、乙方接收到数据,然后使用约定的密钥对数据进行解密
整个模型很像hmac的数据交互过程,都是一个密钥的概念,而且密钥都是双方知道的。但是hmac算法是信息摘要的获取。这边是对数据进行加解密
三、java6和bouncycastle针对des算法的数据加密支持还是不同的。体现在密钥长度,工作模式以及填充方式上。这里bouncycastle的密钥长度是64位。不过在DESede算法上bouncy castle也是密钥长度比java6的密钥长度要长。
不过所有的对称加密算法的实现还是类似的。可以参看如下的代码:
1、des算法
package com.ca.test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* DES对称加密算法
* @author kongqz
* */
public class DESCoder {
/**
* 密钥算法
* java支持56位密钥,bouncycastle支持64位
* */
public static final String KEY_ALGORITHM="DES"; /**
* 加密/解密算法/工作模式/填充方式
* */
public static final String CIPHER_ALGORITHM="DES/ECB/PKCS5Padding"; /**
*
* 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥
* @return byte[] 二进制密钥
* */
public static byte[] initkey() throws Exception{ //实例化密钥生成器
KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
//初始化密钥生成器
kg.init(56);
//生成密钥
SecretKey secretKey=kg.generateKey();
//获取二进制密钥编码形式
return secretKey.getEncoded();
}
/**
* 转换密钥
* @param key 二进制密钥
* @return Key 密钥
* */
public static Key toKey(byte[] key) throws Exception{
//实例化Des密钥
DESKeySpec dks=new DESKeySpec(key);
//实例化密钥工厂
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
//生成密钥
SecretKey secretKey=keyFactory.generateSecret(dks);
return secretKey;
} /**
* 加密数据
* @param data 待加密数据
* @param key 密钥
* @return byte[] 加密后的数据
* */
public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k=toKey(key);
//实例化
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
* 解密数据
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密后的数据
* */
public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
//欢迎密钥
Key k =toKey(key);
//实例化
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String str="DES";
System.out.println("原文:"+str);
//初始化密钥
byte[] key=DESCoder.initkey();
System.out.println("密钥:"+Base64.encodeBase64String(key));
//加密数据
byte[] data=DESCoder.encrypt(str.getBytes(), key);
System.out.println("加密后:"+Base64.encodeBase64String(data));
//解密数据
data=DESCoder.decrypt(data, key);
System.out.println("解密后:"+new String(data));
}
}
控制台输出结果:
原文:DES
密钥:ocewbYVbtmE=
加密后:w6KsVSkLV3Q=
解密后:DES
2、desede算法演示
package com.ca.test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
* DESede对称加密算法演示
* @author kongqz
* */
public class DESedeCoder {
/**
* 密钥算法
* */
public static final String KEY_ALGORITHM="DESede"; /**
* 加密/解密算法/工作模式/填充方式
* */
public static final String CIPHER_ALGORITHM="DESede/ECB/PKCS5Padding"; /**
*
* 生成密钥
* @return byte[] 二进制密钥
* */
public static byte[] initkey() throws Exception{ //实例化密钥生成器
KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
//初始化密钥生成器
kg.init(168);
//生成密钥
SecretKey secretKey=kg.generateKey();
//获取二进制密钥编码形式
return secretKey.getEncoded();
}
/**
* 转换密钥
* @param key 二进制密钥
* @return Key 密钥
* */
public static Key toKey(byte[] key) throws Exception{
//实例化Des密钥
DESedeKeySpec dks=new DESedeKeySpec(key);
//实例化密钥工厂
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
//生成密钥
SecretKey secretKey=keyFactory.generateSecret(dks);
return secretKey;
} /**
* 加密数据
* @param data 待加密数据
* @param key 密钥
* @return byte[] 加密后的数据
* */
public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k=toKey(key);
//实例化
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
* 解密数据
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密后的数据
* */
public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
//欢迎密钥
Key k =toKey(key);
//实例化
Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
//初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);
//执行操作
return cipher.doFinal(data);
}
/**
* 进行加解密的测试
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String str="DESede";
System.out.println("原文:/t"+str);
//初始化密钥
byte[] key=DESedeCoder.initkey();
System.out.println("密钥:/t"+Base64.encodeBase64String(key));
//加密数据
byte[] data=DESedeCoder.encrypt(str.getBytes(), key);
System.out.println("加密后:/t"+Base64.encodeBase64String(data));
//解密数据
data=DESedeCoder.decrypt(data, key);
System.out.println("解密后:/t"+new String(data));
}
}
控制台输出结果:
原文: DESede
密钥: BBDmwTjBsF7IwTIyGWt1bmFntRyUgMQL
加密后: FM/DsEv3KgM=
解密后: DESede
四、总结
1、主要看设定密钥的长度的变化。同时,bouncycastle支持更多的填充模式,在相同算法上比java6实现的版本的密钥长度要长
2、java的api中仅仅提供了DES,DESede和PBE 3三种对称加密算法密钥材料实现类
对称加密算法-DES以及DESede算法的更多相关文章
- [转] 对称加密算法DES、3DES
转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...
- 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。
对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...
- 对称加密算法 ~ Des
一.对称加密 (Symmetric Key Encryption) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...
- 对称加密算法DES、3DES和AES 原理总结(转载)
1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...
- java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4
概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...
- 第七章 对称加密算法--DES
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...
- 计算机网络安全 —— 对称加密算法 DES
一.对称加密算法概念 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换人都不可理解的形式, 从而保证了数据的机密性.这种变换被称为加密 ...
- DES、3DES、AES、PBE对称加密算法实现及应用
1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...
随机推荐
- Hive安装与配置——深入浅出学Hive
第一部分:软件准备与环境规划 Hadoop环境介绍 •Hadoop安装路径 •/home/test/Desktop/hadoop-1.0.0/ •Hadoop 元数据存放目录 •/home/test/ ...
- iOS:ASIHttpRequest虽不更新,但仍值得详细了解
一.使用ASIHTTPRequest可以很方便的进行一下操作:同步/异步方式下载数据,定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须是异步的),提交表单,文件上传,处理cookie,设 ...
- MonoSingleton——Unity中的单例模式
Unity中有很多特别的类需要以单例模式呈现,比如全局的UI管理类,各种缓存池,以及新手导航类等等.而Unity中,因为所有继承自Monobehaviour的脚本在实现的时候都是单线程的,所以像网上流 ...
- 努力让java学习系统化
这段日子接手一社区系统的开发.开发过程中感觉到自己接触到的和所作的多是业务逻辑性开发,对java开发到如今还没有一个清晰明白的路线,我越来越感觉到问题的重要性. 问题一:代码仅仅注重了功能实现,对代码 ...
- boost.asio学习笔记一、linux下boost库的安装
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46761029 学习开源库第一步就是编译安装好库,然后执行成功一个 ...
- (转)D3d9c的固定渲染管道(fixed function pipeline)与可编程管道(programmable function pipeline)的异同点
转自:http://blog.csdn.net/tspatial_thunder/article/details/5937701 现在的游戏图形部分越来多依靠GPU来渲染绘制.说起GPU先说着色器,着 ...
- hdu 5247 找连续数(思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 找连续数 Time Limit: 2000/1000 MS (Java/Others) M ...
- APNS 生成证书 p12 或者 PEM
.net环境下须要p12文件,下面是生成p12过程 1.$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem ...
- PHP如何安装和配置Zend Studio
1 网上下载该软件,安装之后关闭三个东西 2 新建一个本地的PHP项目 3 展开左侧的资源树,发现多了一个PHP的相关东西 4 右击"基础知识",新建一个PHP文件并输入以下代码 ...
- PHP快速入门 如何下载和安装
1 从该网站下载 http://www.appservnetwork.com/ 2 双击安装,注意安装路径和安装组件 按下面的填写,端口不要和IIS冲突,字符编号为UTF-8 安装完成之后,注意安装文 ...