一、简述

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

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三种对称加密算法密钥材料实现类

Java 3desede加解密_JAVA加解密11-对称加密算法-DES以及DESede算法相关推荐

  1. JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI

    术语 密码分类 OSI与TCP/IP安全体系 JAVA安全 Base64算法 消息摘要算法MD 消息摘要算法MD图解 消息摘要算法SHA 消息摘要算法SHA图解 消息摘要算法MAC 消息摘要算法MAC ...

  2. java 对称加密 教程_Java 对称加密算法DES 的使用教程

    前面一篇我写了对称加密算法IDEA的使用教程<Java 对称加密算法IDEA 的使用教程>.今天我们来学习另外一个对称加密算法DES.DES算法使用相对广泛一些,一些老的项目中可能会遇到. ...

  3. Java实现密码学工具,集成了对称加密算法DES,AES,IDEA,公开加密算法RSA,ECC,散列算法MD5,SHA1,CRC32,以及RSA,DSA,ECDSA数字签名验证示例。

    密码学综合工具 前言 git网址 项目结构 项目预览 String与byte[]互转 通过`String`类转换 通过`Base64`互转[jdk-8] 前言 我们网络信息安全的实验...要我们找各种 ...

  4. java解密_JAVA加解密

    [前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及使用方法和例子 [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥 ...

  5. java对sha1的解密_java 加密解密算法MD5/SHA1,DSA

    通常,使用的加密算法 比较简便高效,密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用. 第1章基础知识 1.1. 单 ...

  6. java短信内容加链接_Java加腾讯云实现短信验证码功能

    准备工作 1.选择服务 2.添加应用:我已经添加完了 3.点击应用名称 4.出现ID和Key 5.编辑短信创建签名 6.在第5步后 使用到的jar包: qcloudsms-1.0.2.jar com. ...

  7. java加密 c解密_java+加密解密

    EncrypAES public class EncrypAES { // KeyGenerator 提供对称密钥生成器的功能,支持各种算法 private KeyGenerator keygen; ...

  8. java 字符串加密解密_Java加密解密字符串

    importjava.security.Key;importjava.security.Security;importjavax.crypto.Cipher;/*** DES加密和解密工具,可以对字符 ...

  9. java 配置文件加载_Java加载配置文件类

    package com.up72.parkSys.ThirdParty; import java.io.IOException; import java.io.InputStream; import ...

最新文章

  1. java泛型 算法_非常具体的Java泛型问题 – 如何返回传递给方法的相同类型?
  2. jsp解决mysql乱码_jsp+mysql时乱码的解决
  3. Selenium不打开浏览器采爬取数据 Java
  4. 重建Windows 7的图标缓存
  5. [Java并发编程实战] 简介
  6. IM即时通讯项目框架分析
  7. 那些年用过的机械键盘
  8. UPS电源扩展功能一UPS干节点通讯接口扩展板,你了解吗?
  9. 移动端实现点击按钮复制文本功能
  10. 单片机基础知识学习笔记
  11. 多家软件厂商卷入360与腾讯之争
  12. 木兰当事人回应!承认部分基于 Python 二次开发
  13. Access denied for user 'root'@'localhost'. Account is locked
  14. oracle入门操作3(关于查询 )
  15. A Game of Thrones(49)
  16. IDEA中WEB项目结构和Artifacts设置
  17. Java语言程序设计基础篇(第十版 梁勇著)课后习题答案 - 第二章
  18. fiddler 抓取手机上点击微信公众号的链接
  19. ios友盟错误_iOS 2017友盟错误统计及分析
  20. 密码学认证协议名词解释,AKE,PKI,IBC,PKG,KGC,

热门文章

  1. 使用RegularExpressionValidator验证(转)
  2. SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT()
  3. base64 golang 图片_golang基础学习-base64使用
  4. angular4点击事件监听_angular 事件广播和事件监听
  5. vb mysql边记录边统计_VB与Access连接,检索、核对、处理数据
  6. android 测试工具,安卓测试工具的几种实现方式
  7. linux有k歌软件吗,在Linux下可用Wine安装和运行暴风影音16、全民K歌
  8. c语言程序设计实践教程编程题8.3,C语言程序设计教程(21世纪计算机科学与技术实践型教程)...
  9. mysql server出现_查询各阶段时,一旦mysql server出现各种故障下的表现形式
  10. 古风祥云PNG免抠素材,喜欢吗?