apache实现的AES256加密

官方用户指导链接:http://commons.apache.org/proper/commons-crypto/userguide.html

官方字节缓存实现的例子链接:http://commons.apache.org/proper/commons-crypto/xref-test/org/apache/commons/crypto/examples/CipherByteBufferExample.html

其实官方给了两种实现,另外一种是字节数组方式,如果加密的字符串过长,官方例子中的new的字节数组会异常,不如字节缓存方式更好。这里说下字节缓存的实现。

官方例子的main方法是加密和解密一起处理的,不实际;我将官方例子中的main方法里的逻辑拆出来了加密和解密两个方法(注:@slf4j需要用到lombok,如果你没有引入,则把该注解去掉,修改代码中的log)

package com.dmy.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.crypto.cipher.CryptoCipher;
import org.apache.commons.crypto.utils.Utils;
import org.springframework.util.Base64Utils; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.util.Properties; /**
* Example showing the CryptoCipher API using a ByteBuffer
*/
@Slf4j
public class CipherByteBufferExample {
//32字节长度的秘钥,也就是256位
static final SecretKeySpec key = new SecretKeySpec(getUTF8Bytes("12345678901234561234567890123456"), "AES");
//固定16字节长度
static final IvParameterSpec iv = new IvParameterSpec(getUTF8Bytes("1234567890123456"));
//加密方法/加密模式/填充方式,CBC是安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准
static final String transform = "AES/CBC/PKCS5Padding"; /**
* Converts String to UTF8 bytes
*
* @param input the input string
* @return UTF8 bytes
*/
private static byte[] getUTF8Bytes(String input) {
return input.getBytes(StandardCharsets.UTF_8);
} /**
* Converts ByteBuffer to String
*
* @param buffer input byte buffer
* @return the converted string
*/
private static String asString(ByteBuffer buffer) {
final ByteBuffer copy = buffer.duplicate();
final byte[] bytes = new byte[copy.remaining()];
copy.get(bytes);
return new String(bytes, StandardCharsets.UTF_8);
} /**
* 加密
* @param text 需要加密的明文
* @return 经过base64加密后的密文
* @throws IOException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws ShortBufferException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String encrypt(String text) throws IOException, InvalidAlgorithmParameterException, InvalidKeyException, ShortBufferException, BadPaddingException, IllegalBlockSizeException {
Properties properties = new Properties();
final ByteBuffer outBuffer;
final int bufferSize = 1024;
final int updateBytes;
final int finalBytes;
//Creates a CryptoCipher instance with the transformation and properties.
try (CryptoCipher encipher = Utils.getCipherInstance(transform, properties)) { ByteBuffer inBuffer = ByteBuffer.allocateDirect(bufferSize);
outBuffer = ByteBuffer.allocateDirect(bufferSize);
inBuffer.put(getUTF8Bytes(text)); inBuffer.flip(); // ready for the cipher to read it
// Show the data is there
log.debug("inBuffer={}", asString(inBuffer)); // Initializes the cipher with ENCRYPT_MODE,key and iv.
encipher.init(Cipher.ENCRYPT_MODE, key, iv); // Continues a multiple-part encryption/decryption operation for byte buffer.
updateBytes = encipher.update(inBuffer, outBuffer);
log.debug("updateBytes={}", updateBytes); // We should call do final at the end of encryption/decryption.
finalBytes = encipher.doFinal(inBuffer, outBuffer);
log.debug("finalBytes={}", finalBytes);
} outBuffer.flip(); // ready for use as decrypt
byte[] encoded = new byte[updateBytes + finalBytes];
outBuffer.duplicate().get(encoded);
String encodedString = Base64Utils.encodeToString(encoded);
log.debug("encodedString={}", encodedString);
return encodedString;
} /**
* 解密
* @param encodedString 经过base64加密后的密文
* @return 明文
* @throws IOException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws ShortBufferException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static String dencrypt(String encodedString) throws IOException, InvalidAlgorithmParameterException, InvalidKeyException, ShortBufferException, BadPaddingException, IllegalBlockSizeException {
Properties properties = new Properties();
final ByteBuffer outBuffer;
final int bufferSize = 1024;
ByteBuffer decoded = ByteBuffer.allocateDirect(bufferSize);
//Creates a CryptoCipher instance with the transformation and properties.
try (CryptoCipher decipher = Utils.getCipherInstance(transform, properties)) {
decipher.init(Cipher.DECRYPT_MODE, key, iv);
outBuffer = ByteBuffer.allocateDirect(bufferSize);
outBuffer.put(Base64Utils.decode(getUTF8Bytes(encodedString)));
outBuffer.flip();
decipher.update(outBuffer, decoded);
decipher.doFinal(outBuffer, decoded);
decoded.flip(); // ready for use
log.debug("decoded={}", asString(decoded));
} return asString(decoded);
} }

AES apache commons-crypto 对称加密的更多相关文章

  1. vue中使用AES.js和crypto.js加密

    一:crypto-js加密 1.1:安装依赖 npm install crypto-js --save-dev 1.2 :在项目目录上创建一个js文件里面写入加密,解密的代码 mport Crypto ...

  2. 数字签名中公钥和私钥是什么?对称加密与非对称加密,以及RSA的原理

    http://baijiahao.baidu.com/s?id=1581684919791448393&wfr=spider&for=pc https://blog.csdn.net/ ...

  3. 对称加密与非对称加密,以及RSA的原理

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  4. (转)对称加密与非对称加密,以及RSA的原理

    一 概述 二对称加密和非对称加密 对称加密 非对称加密 区别 三RSA原理 整数运算 同余运算 当模数为合数n时 当模数为质数p的时候 离散对数问题 RSA原理 一 , 概述 在现代密码学诞生以前,就 ...

  5. 对称加密与非对称加密,及Hash算法

    一 , 概述 在现代密码学诞生以前,就已经有很多的加密方法了.例如,最古老的斯巴达加密棒,广泛应用于公元前7世纪的古希腊.16世纪意大利数学家卡尔达诺发明的栅格密码,基于单表代换的凯撒密码.猪圈密码, ...

  6. 对称加密----AES和DES加密、解密

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...

  7. AES/CBC/PKCS5Padding对称加密

    package unit; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.cry ...

  8. JDK自带方法实现AES对称加密

    请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import ...

  9. 前后端对称加密(AES)

    后端实现(JAVA) package com.vcgeek.hephaestus.demo; import org.apache.commons.codec.binary.Base64; import ...

随机推荐

  1. LR分析Analysis火车票

    一.分析结果 1 研究 Vuser 的行为(F:\JMeter\0Tutorial-SCR\机票预订\机票_analysis-session) 筛选该图,仅查看所有 Vuser 同时运行的时间段 右键 ...

  2. [CSP-S模拟测试]:赛(贪心+三分)

    题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...

  3. 新建 SecondFragment 实现类

    package com.test.mvp.mvpdemo.mvp.v6.view; import android.os.Bundle;import android.support.annotation ...

  4. xpath定位不到原因浅析

    在爬虫中,我们经常使用xpath来对元素进行定位,xpath定位分为两种,一种是绝对定位,/html/body/div[2]/div[1]/div/div[3]/a[7],另外一种是相对定位,比如r' ...

  5. cookie字段属性解析

    一个域名下面可能存在着很多个cookie对象.如果我们用selenium的get_cookies方法,可以得到当前浏览器的多个cookie,比如: {'name': 'QCARJSESSIONID', ...

  6. 【转】时间序列分析——基于R,王燕

    <时间序列分析——基于R>王燕,读书笔记 笔记: 一.检验: 1.平稳性检验: 图检验方法:     时序图检验:该序列有明显的趋势性或周期性,则不是平稳序列     自相关图检验:(ac ...

  7. 大数据学习笔记之Zookeeper(二):Zookeeper实战篇(一)

    文章目录 2.1 本地模式安装部署 2.2 配置参数解读 2.1 本地模式安装部署 1)安装前准备: (1)安装jdk (2)通过filezilla工具拷贝zookeeper到到linux系统下 (3 ...

  8. Python 操作 mongodb 亿级数据量使用 Bloomfilter 高效率判断唯一性 例子

    工作需要使用 python 处理 mongodb 数据库两亿数据量去重复,需要在大数据量下快速判断数据是否存在 参考资料:https://segmentfault.com/q/101000000061 ...

  9. Python笔记(十六)_else语句、with语句

    else的多种用法 1.try except + else:检测到代码无异常,才执行else 例如: def func(num): count=num//2 while count>1: if ...

  10. Git003--创建版本库

    Git--创建版本库 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 ...