一、简述

对称加密算法就是能将数据加解密。加密的时候用密钥对数据进行加密,解密的时候使用同样的密钥对数据进行解密。

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算法的更多相关文章

  1. [转] 对称加密算法DES、3DES

    转自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法, ...

  2. 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  3. 对称加密算法DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES。

    对称加密算法:DES,3重DES,TDEA,Blowfish,RC5,IDEA,AES. 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文 ...

  4. 对称加密算法 ~ Des

    一.对称加密 (Symmetric Key Encryption)  对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...

  5. 对称加密算法DES、3DES和AES 原理总结(转载)

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  6. java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

    概述 信息安全基本概念: DES(Data Encryption Standard,数据加密标准) 3DES(Triple DES,三重数据加密算法(TDEA,Triple Data Encrypti ...

  7. 第七章 对称加密算法--DES

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...

  8. 计算机网络安全 —— 对称加密算法 DES

    一.对称加密算法概念 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换人都不可理解的形式, 从而保证了数据的机密性.这种变换被称为加密 ...

  9. DES、3DES、AES、PBE对称加密算法实现及应用

    1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...

随机推荐

  1. 如何获得Windows Server 2012上的FC的WWN

    我有一个测试环境, 一对Host与storage array之间既有iSCSI的连接, 也有FC的连接. 原来iSCSI的连接是OK的, 现在需要转用FC. 当在光纤交换机上划好了Zone之后, st ...

  2. easyui更换主题之后出现validatebox的验证提示信息显示跑偏的解决方案

    在easyui中更换主题为非default的主题,有的主题会出现如下图所示的情况,验证提示信息的提示内容跑到了下面. 现在说下原因和解决方案: 原因:原因是easyui对某些主题没有进行这个样式的设置 ...

  3. SSIS无法在unicode和非unicode 字符串数据类型之间转换

    场景:SSIS从oracle抽到sqlserver,一个表对表到数据仓库ODS层的抽取,没有任何逻辑结果遇到问题: SSIS无法在unicode和非unicode 字符串数据类型之间转换 如下图2个字 ...

  4. Cognos如何开启CJAP认证程序日志

    步骤: 1:修改ipfaaaclientconfig.xml.sample为ipfclientconfig.xml,修改<param name="File" value=&q ...

  5. (笔试题)N!的三进制数尾部0的个数

    题目: 用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0. 思路: 这道题与上一篇博文N!尾部连续0的个数的思路是一样的. 计算N!下三进制结果末尾 ...

  6. Unity3D开发之Mac OS 开发环境搭建 笔记

    http://www.cnblogs.com/zhaoqingqing/p/3383167.html 首先上几张图: 摸索了一上午,才搞定在模拟器中运行.至于在Iphone真机中运行,虽然有开发者证书 ...

  7. 基于微信小程序的用户列表点赞功能

    代码地址如下:http://www.demodashi.com/demo/13997.html 一.前言 (1).适合人群 1.微信小程序开发者 2.前端工程师 3.想入门学习小程序开发的人员 4.想 ...

  8. Java 的抽象特性:抽象类与接口深度解析

    要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...

  9. PHP递归方式把一个数组里面的null转换为空字符串”的方法

    在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...

  10. Centos 开启telnet-service服务

    1. 查看linux版本信息: [loong@localhost ~]$ cat /etc/issue CentOS release 5.8 (Final) Kernel \r on an \m 2. ...