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. Java笔记之java.lang.String#trim

    String的trim()方法是使用频率频率很高的一个方法,直到不久前我不确定trim去除两端的空白符时对换行符是怎么处理的点进去看了下源码的实现,才发现String#trim的实现跟我想像的完全不一 ...

  2. 勒索软件Locky、Tesalcrypt等使用了新的工具躲避检测

    勒索软件Locky.Tesalcrypt等使用了新的工具躲避检测 今天我们发现Locky勒索软件家族使用一种新的工具来躲避检测,并且可能已经感染了很多节点. 自从我们通过AutoFocus智能威胁分析 ...

  3. linux笔记_day12_shell编程

    1.shell中如何进行算术运算 A=1 B=2 1)let 算术运算表达式 let C=$A+$B 2)$[算术运算表达式] C=$[$A+$B] 3)$(($A+$B)) 4) expr 算术表达 ...

  4. mongo批量操作存在更新否则插入

    def save_data(ok_ps): ns = [] for ok in ok_ps: ok['last_use_time'] = 0 ok['protocol'] = 0 # 协议类型 0:h ...

  5. phantomjs waitFor

    function waitFor(testFx, onReady, timeOutMillis) { var maxtimeOutMillis = timeOutMillis ? timeOutMil ...

  6. Python学习一|anaconda的安装问题以及Python语言的特点

    安装时遇到的问题 安装anaconda3.0到D盘之后,配置好两个环境变量:D:\anaconda和D:\anaconda\Scripts.发现在命令行中执行python指令可以,但conda指令却是 ...

  7. ssh远程免密登录Linux

    一.在本地机器创建公钥,一路回车即可 ssh-keygen -t rsa 二.发送公钥到远程服务器端 如果是默认端口:scp id_rsa.pub user@ip:~/.shh 如果远程服务器设置的是 ...

  8. 网络抓包神器-Charles使用指南

    http://blog.csdn.net/liulanghk/article/details/46342205 目录 概述 安装 显示模式 PC端抓包 移动应用抓包 其他技能 charles使用问题汇 ...

  9. protected

    protected  继承访问权限 在同一包中可以访问protected成员. 继承状态可以访问protected成员 在不同包中非继承不可以访问protected成员.

  10. [转] 钉钉的H5性能优化方案

    对于一个H5的产品,功能无疑很重要,但是性能同样是用户体验中不可或缺的一环.原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性. 用户感受 当用户能 ...