package com.edu.hpu;

import java.math.BigInteger;

import java.security.MessageDigest;

import java.security.SecureRandom;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class No14 {

public static void main(String[] args) throws Exception {

String content = "***";

System.out.println("加密前:" + content);

String key = "123";

System.out.println("加密密钥和解密密钥:" + (int)'1' + " " + (int)'2' + " " + (int)'3' );

String encrypt = aesEncrypt(content, key);

System.out.println("密文:" + encrypt);

String decrypt = aesDecrypt(encrypt, key);

System.out.println("解密后:" + decrypt);

}

/**

* 将byte[]转为各种进制的字符串

* @param bytes byte[]

* @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制

* @return 转换后的字符串

*/

public static String binary(byte[] bytes, int radix){

return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数

}

/**

* base 64 encode

* @param bytes 待编码的byte[]

* @return 编码后的base 64 code

*/

public static String base64Encode(byte[] bytes){

return new BASE64Encoder().encode(bytes);

}

/**

* base 64 decode

* @param base64Code 待解码的base 64 code

* @return 解码后的byte[]

* @throws Exception

*/

public static byte[] base64Decode(String base64Code) throws Exception{

return QStringUtil.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);

}

/**

* 获取byte[]的md5值

* @param bytes byte[]

* @return md5

* @throws Exception

*/

public static byte[] md5(byte[] bytes) throws Exception {

MessageDigest md = MessageDigest.getInstance("MD5");

md.update(bytes);

return md.digest();

}

/**

* 获取字符串md5值

* @param msg

* @return md5

* @throws Exception

*/

public static byte[] md5(String msg) throws Exception {

return QStringUtil.isEmpty(msg) ? null : md5(msg.getBytes());

}

/**

* 结合base64实现md5加密

* @param msg 待加密字符串

* @return 获取md5后转为base64

* @throws Exception

*/

public static String md5Encrypt(String msg) throws Exception{

return QStringUtil.isEmpty(msg) ? null : base64Encode(md5(msg));

}

/**

* AES加密

* @param content 待加密的内容

* @param encryptKey 加密密钥

* @return 加密后的byte[]

* @throws Exception

*/

public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {

//加密解密时都加上,否则不同机器加密结果不一致

KeyGenerator kgen = KeyGenerator.getInstance("AES");

SecureRandom random=SecureRandom.getInstance("SHA1PRNG");

random.setSeed(encryptKey.getBytes());

kgen.init(128, random);

//一般写法

//KeyGenerator kgen = KeyGenerator.getInstance("AES");

//kgen.init(128, new SecureRandom(encryptKey.getBytes()));

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));

return cipher.doFinal(content.getBytes("utf-8"));

}

/**

* AES加密为base 64 code

* @param content 待加密的内容

* @param encryptKey 加密密钥

* @return 加密后的base 64 code

* @throws Exception

*/

public static String aesEncrypt(String content, String encryptKey) throws Exception {

return base64Encode(aesEncryptToBytes(content, encryptKey));

}

/**

* AES解密

* @param encryptBytes 待解密的byte[]

* @param decryptKey 解密密钥

* @return 解密后的String

* @throws Exception

*/

public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {

//加密解密时都加上,否则不同机器加密结果不一致

KeyGenerator kgen = KeyGenerator.getInstance("AES");

SecureRandom random=SecureRandom.getInstance("SHA1PRNG");

random.setSeed(decryptKey.getBytes());

kgen.init(128, random);

//一般写法

//KeyGenerator kgen = KeyGenerator.getInstance("AES");

//kgen.init(128, new SecureRandom(decryptKey.getBytes()));

Cipher cipher = Cipher.getInstance("AES");

cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"));

byte[] decryptBytes = cipher.doFinal(encryptBytes);

return new String(decryptBytes);

}

/**

* 将base 64 code AES解密

* @param encryptStr 待解密的base 64 code

* @param decryptKey 解密密钥

* @return 解密后的string

* @throws Exception

*/

public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {

return QStringUtil.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);

}

}

class QStringUtil {

public static boolean isEmpty(String str){

if(str==null){

return true;

}else{

return false;

}

}

}

AES加密的更多相关文章

  1. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  2. Android数据加密之Aes加密

    前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...

  3. c#和js互通的AES加密解密

    一.使用场景 在使用前后端分离的框架中常常会进行传输数据相互加密解密以确保数据的安全性,如web Api返回加密数据客户端或web端进行解密,或者客户端或web端进行加密提交数据服务端解密数据等等. ...

  4. AES加密解密通用版Object-C / C# / JAVA

    1.无向量 128位 /// <summary> /// AES加密(无向量) /// </summary> /// <param name="plainByt ...

  5. nodejs与javascript中的aes加密

    简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...

  6. 非对称技术栈实现AES加密解密

    非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...

  7. Java aes加密C#解密的取巧方法

    摘要: 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Ja ...

  8. AES 加密工具类

    /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化: */public class AESOperator { /* * 加密用的 ...

  9. android base64 和 aes 加密 解密

    package pioneerbarcode.ccw.com.encryptanddecode;import android.os.Bundle;import android.support.v7.a ...

随机推荐

  1. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  2. StringMVC 中如何做数据校验

    步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"> ...

  3. VisualVM通过jstatd方式远程监控远程主机

    配置好权限文件 [root@test bin]# cd $JAVA_HOME/bin [root@test bin]# vim jstatd.all.policy grant codebase &qu ...

  4. 前端学HTTP之实体和编码

    前面的话 每天都有各种媒体对象经由HTTP传送,如图像.文本.影片以及软件程序等.HTTP要确保它的报文被正确传送,识别.提取以及适当处理.为了实现这些目标,HTTP使用了完善的标签来描述承载内容的实 ...

  5. 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)

    在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...

  6. 视频 - 在 VirtualBox 中部署 OpenStack

    大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...

  7. 设置tomcat远程debug

    查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...

  8. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  9. cocos2dx调用浏览器打开网址

    安卓端cocos2dx/platform/android路径下CCApplication.h: virtual void openURL(const char* pszUrl); CCApplicat ...

  10. vue.js几行实现的简单的todo list

    序:目前前端框架如:vue.react.angular,构建工具fis3.gulp.webpack等等...... 可谓是五花八门,层出不穷,眼花缭乱...其实吧只要你想玩还是可以玩玩的..下面是看了 ...