AES和DES都是对称加密算法,其中DES全称为Data Encryption Standard,AES全称为Advanced Encryption Standard即高级加密标准。

  DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。而AES高级加密标准已然成为对称密钥加密中最流行的算法之一。在我们的实际开发中,现在更建议选择AES算法。

  下面是维基百科对两者的解释:DESAES,由于AES的实用性和安全性以及性能,这里只给出AES的代码实现,DES的Java实现会面给出参考链接。

  

 package com.****.common.util;

 import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.log4j.LogManager;
import org.apache.log4j.Logger; public class AESUtil { private static final Logger log = LogManager.getLogger(AESUtil.class); /**
* @Description: AES加密
* @author wang
* @date 2017-7-30 下午03:42:47
* @param content 需要加密的内容
* @param password 加密密钥
* @return
*/
public static String encrypt(String content, String AESKey){
try{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
random.setSeed(AESKey.getBytes()); kgen.init(128, random);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] encryptResult = cipher.doFinal(byteContent); //加密后接口 String result = Base64.encodeBytes(encryptResult);
return result; // 加密
}catch (Exception e){
log.error("AES加密时出现异常:【content:"+content+";AESPwd:"+AESKey+"】",e);
}
return null;
} /**
*
* @Description: AES解密
* @author wang
* @date 2017-7-30 下午04:05:32
* @param content 待解密内容
* @param password 解密密钥
* @return
*/
public static String decrypt(String content, String AESKey){
try{
byte[] contentByte = Base64.decode(content);// 先用base64解密
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom random=SecureRandom.getInstance("SHA1PRNG");
random.setSeed(AESKey.getBytes()); kgen.init(128, random);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(contentByte);
return new String(result,"utf-8"); // 解密
}catch(Exception e){
log.error("AES解密时出现异常:[content:"+content+";AESPwd:"+AESKey+"]");
}
return null;
} //test
public static void main(String[] args) throws IOException {
String a = "JDE1234567891234567891_abcd-1234-abcd-1234";
String aesKey="JDE1234567891234567891";
String encodeStr = encrypt(a,aesKey);
System.out.println(encodeStr);
String decodeStr = decrypt(encodeStr,aesKey);
System.out.println(decodeStr);
}
}

  运行结果:

  

  延伸一点:关于AES加密后得到的密文的长度,我在网上看到的有一种解释是密文长度只和明文长度有关,和秘钥长无关,但是根据代码的实际运行情况看不是这样,而是和明文以及秘钥都有关。关于密文长度问题,欢迎大家一起讨论。

  关于DES的Java代码实现:参考这里

Java常用加密方案及实现——AES和DES的更多相关文章

  1. java常用加密和解密工具类EncryptUtil.java

    package cn.util; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...

  2. JAVA常用加密解密算法Encryption and decryption

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  3. 分布式锁1 Java常用技术方案

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...

  4. 分布式锁1 Java常用技术方案(转)

    转:http://www.cnblogs.com/PurpleDream/p/5559352.html#3450419 前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临 ...

  5. 关于分布式锁Java常用技术方案

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.      所以自己结合实际工作中的一些经验和网上 ...

  6. 分布式锁1 Java常用技术方案【转载】

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...

  7. 分布式锁 -- Java常用技术方案

    来自博客园http://www.cnblogs.com/PurpleDream/p/5559352.html , 前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分 ...

  8. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  9. 关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

随机推荐

  1. CSS-3 Transform 的使用

    CSS3制作动画的几个属性:变形(transform).转换(transition)和动画(animation)等更高级的CSS3技术.这篇主要是 Transform 的使用. Transform 字 ...

  2. 20155211 2016-2017-2 《Java程序设计》第六周学习总结

    20155211 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 输入/输出 一.InputStream与OutputStream (一)串流设计的概 ...

  3. iOS中UITableView和UICollectionView的默认空态页

    项目中想实现空态页风格统一控制的效果,就封装了一个默认空态页,使用的技术点有:1 方法替换 ,2 给分类(Category)添加属性. 我们知道,扩展(extension)可以给类添加私有变量和方法. ...

  4. HDU 4508 湫湫系列故事——减肥记I (完全背包)

    题意:有n种食物,每种食物可以给湫湫带来一个幸福感a,同时也会给她带来b的卡路里的摄入,然后规定她一天摄入的卡路里的量不能超过m,一共有n种食物,问可以得到的 最大的幸福感是多少? 解题报告:一开始以 ...

  5. MYSQL导入数据出现The MySQL server is running with the --secure-file-priv

    MYSQL导入数据出现The MySQL server is running with the --secure-file-priv option so it cannot execute this ...

  6. Dhaka2011

    Dhaka2011 A - Binary Matrix 题目描述:有一个\(n \times m\)的\(01\)矩阵,这一矩阵第一行和最后一行是相邻的,第一列和最后一列是相邻的,现在每次可以交换相邻 ...

  7. 网络协议之TLS

    前言 由于在TCP.UDP等方式传输数据时,数据包有可能被其他人截获,并解析出信息,这就给信息安全带来了很大的挑战.最初的SSL协议被网景公司提出,它不会影响上层协议(如HTTP.电子邮件等),但可以 ...

  8. java 轨迹栈

    printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接访问. getStackTrace()方法返回一个由根轨迹中的元素所构成的数组,每一个元素都表示栈中的一 ...

  9. Ruby语言学习笔记

    在codecademy上开始玩ruby了 1.数据类型:boolean,string,number 变量直接用即可,不用声明(“拿来主义”) 运算符:+ - * / ** % == != && ...

  10. EntityFrameWork 图解