起因

这段时间因为要对接一个外部接口,其参数的加密方式为AES,就需要学下AES的加密写法,但网上的资料不是很全,自己记录下遇到的坑;

基本写法

String str = "hello";
String password = "1234567890123456";
//新建一个密码编译器的实例,由三部分构成,用"/"分隔,分别代表加密的类型(如AES,DES,RC2等),模式(AES中包含ECB,CBC,CFB,CTR,CTS等),补码方式(包含nopadding/PKCS5Padding等等),依据这三个参数可以创建很多种加密方式
Cipher cipher = Cipher.getInstance(String.format("%s/%s/%s", SymmetricAlgorithm.AES.name(), Mode.ECB.name(), Padding.PKCS5Padding.name()));
//构建密钥
SecretKeySpec key = new SecretKeySpec(password.getBytes(Charset.forName("utf-8")),"AES");
cipher.init(Cipher.ENCRYPT_MODE, key);//使用加密模式初始化 密钥
byte[] encrypt = cipher.doFinal(str.getBytes()); //按单部分操作加密或解密数据,或者结束一个多部分操作。
System.out.println(Base64.encode(encrypt));
System.out.println("method2-加密:" + Arrays.toString(encrypt));
cipher.init(Cipher.DECRYPT_MODE, key);//使用解密模式初始化 密钥
byte[] decrypt = cipher.doFinal(encrypt);
System.out.println("method2-解密后:" + new String(decrypt));

  

优化写法

这样一个最简单的AES加解密就完成了,但有一个缺点,密码的长度必须为128位,也就是16个字节,否则会报错;
当使用AES/ECB/NoPadding模式时,加密的内容的字节长度也必须为16的整倍数,否则也会提示错误;
可采用的方法是:如果key的长度小于16,则补全16位,否则截取16位
加密内容补全为16的整倍数,以下为示例代码:

/**
* 测试AES加密,使用ECB/Nopadding的方式,要求key的长度为128位,内容的长度也为128位的整数倍
* @param content
* @param password
* @return
*/
private String testAes(String content,String password) throws Exception {
//原始字节数组
byte[] passwordBytes = password.getBytes(Charset.forName("utf-8"));
//填充为16位
byte[] keyBytes = new byte[16];
byte[] contentBytes = content.getBytes(Charset.forName("utf-8"));
byte[] contentBytesTarget ;
Cipher cipher = Cipher.getInstance(String.format("%s/%s/%s", SymmetricAlgorithm.AES.name(), Mode.ECB.name(), Padding.NoPadding.name()));
if(passwordBytes.length < 16)
System.arraycopy(passwordBytes,0,keyBytes,0,passwordBytes.length);
else
System.arraycopy(passwordBytes,0,keyBytes,0,16); if(contentBytes.length % 16 == 0)
contentBytesTarget = contentBytes;
else{
contentBytesTarget = new byte[contentBytes.length + 16 - contentBytes.length % 16 ];
System.arraycopy(contentBytes,0,contentBytesTarget,0,contentBytes.length);
} SecretKeySpec key = new SecretKeySpec(keyBytes,"AES"); cipher.init(Cipher.ENCRYPT_MODE, key);//使用加密模式初始化 密钥
byte[] encrypt = cipher.doFinal(contentBytesTarget); //按单部分操作加密或解密数据,或者结束一个多部分操作。
System.out.println(Base64.encode(encrypt));
System.out.println("method2-加密:" + Arrays.toString(encrypt));
cipher.init(Cipher.DECRYPT_MODE, key);//使用解密模式初始化 密钥
byte[] decrypt = cipher.doFinal(encrypt);
System.out.println("method2-解密后:" + new String(decrypt));
return Base64.encode(encrypt);
}

  

测试

可以使用在线工具进行测试:http://tool.chacuo.net/cryptaes

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

AES加密实现的更多相关文章

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

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

  2. AES加密

    package com.edu.hpu; import java.math.BigInteger; import java.security.MessageDigest; import java.se ...

  3. Android数据加密之Aes加密

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

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

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

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

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

  6. nodejs与javascript中的aes加密

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

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

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

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

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

  9. AES 加密工具类

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

  10. android base64 和 aes 加密 解密

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

随机推荐

  1. ABAP 数值四舍五入函数

    VALUE '12.5445' , dat1 . VALUE '12.540'. * 方法一 CALL FUNCTION 'HR_NZ_ROUNDING_DECIMALS' EXPORTING val ...

  2. Inno Setup打包注意事项

    Inno Setup是一个开源的,商业的,快捷的脚本打包工具. 具体打包流程根据界面提示就可以搞定,下面讲解几个注意事项 1.在安装包进行安装的过程当中,很多程序都需要修改配置信息,这就要求我们在安装 ...

  3. JS中最经典的全局变量和局部变量问题

    话不多说,直接上例子: 1.程序的运行结果为:100  10  100 var a = 10; function test(){ a = 100; console.log(a); console.lo ...

  4. JavaScript对象之关联数组

    Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要 ...

  5. Noip2016组合数(数论)

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  6. 在centos6上实现LAMP的FPM模式

    原理 http使用一次编译法编译安装,php独立服务fpm实现. 软件版本 在本次实验中,我们需要用到的软件版本如下: apr-1.6.2 apr-util-1.6.0 httpd-2.4.28 ma ...

  7. Integrates Git with Sublime 3 to pull or push to Github by using Sublime plugin Git

    1. Git must be installed, Sublime plugin "Git" only connects Sublime with Git. Download UR ...

  8. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  9. Angular通信$q服务和promise对象

    promise 约定(promise)是一个对象,表示在未来时间点会发生的某件事情,约定可以是三种状态之一:等待.完成或拒绝.约定将从等待状态开始,然后可以转换为完成或者拒绝状态,一旦约定完成或者被拒 ...

  10. Fibonacci again and again(SG函数应用)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...