AES加密,128-192-256,方案二

2023-11-06

与方案一对比,方案二要简洁很多。

看代码:

package com.xiao.aes.util;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

/**
 *
 * 美国软件出口限制,JDK默认使用的AES算法最高只能支持128位。如需要更高的支持需要从oracle官网下载更换JAVA_HOME/jre/lib/
 * security目录下的: local_policy.jar和US_export_policy.jar。<br/>
 * 采用补码方式以及base64双重加密,依赖commons-codec-1.x.jar包中的base64加密
 *
 * @author xiao
 *
 */
public class AESUtil2 {

 /**
  *
  */
 private static Cipher cipher;

 /**
  * 初始化向量
  */
 private static IvParameterSpec iv;

 static {
  try {
   byte[] vi = Hex.decodeHex("12345678123456781234567812345678"
     .toCharArray());
   iv = new IvParameterSpec(vi);
   // "算法/模式/补码方式"
   cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
  } catch (NoSuchAlgorithmException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchPaddingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (DecoderException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 生成密钥
  *
  * @param type
  *            AES长度
  * @return 密钥
  */
 public static String createAESKey(AESType type) {
  try {
   KeyGenerator key = KeyGenerator.getInstance("AES");
   key.init(type.value);
   SecretKey ckey = key.generateKey();
   byte[] keyByte = ckey.getEncoded();
   return Base64.encodeBase64String(keyByte);
  } catch (NoSuchAlgorithmException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return "";
 }

 /**
  * AES加密
  *
  * @param key
  *            密钥
  * @param plaintext
  *            明文
  * @return 秘文
  */
 public static String encryptAES(String key, String plaintext) {
  String ciphertext = "";
  try {
   byte[] keyByte = Base64.decodeBase64(key);
   SecretKeySpec skeySpec = new SecretKeySpec(keyByte, "AES");
   // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
   cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
   byte[] pbyte = plaintext.getBytes("utf-8");
   byte[] result = cipher.doFinal(pbyte);
   ciphertext = Base64.encodeBase64String(result);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return ciphertext;
 }

 /**
  * 解密
  *
  * @param key
  *            密钥
  * @param ciphertext
  *            秘文
  * @return 明文
  */
 public static String decryptAES(String key, String ciphertext) {
  String plaintext = "";
  try {
   byte[] keyByte = Base64.decodeBase64(key);
   byte[] cbyte = Base64.decodeBase64(ciphertext);
   SecretKeySpec skeySpec = new SecretKeySpec(keyByte, "AES");
   // 使用CBC模式,需要一个向量iv,可增加加密算法的强度
   cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
   byte[] pbyte = cipher.doFinal(cbyte);
   plaintext = new String(pbyte, "utf-8");
  } catch (Exception e) {
   e.printStackTrace();
  }
  return plaintext;
 }

 public static void main(String[] args) {
  String key128 = createAESKey(AESType.AES_128);
  String key192 = createAESKey(AESType.AES_192);
  String key256 = createAESKey(AESType.AES_256);
  System.out.println("Key 128:" + key128);
  System.out.println("Key 192:" + key192);
  System.out.println("Key 256:" + key256);

  String source = "AES加密测试";

  String ciphertext128 = encryptAES(key128, source);
  String ciphertext192 = encryptAES(key192, source);
  String ciphertext256 = encryptAES(key256, source);
  System.out.println("Ciphertext 128:" + ciphertext128);
  System.out.println("Ciphertext 192:" + ciphertext192);
  System.out.println("Ciphertext 256:" + ciphertext256);

  String plaintext128 = decryptAES(key128, ciphertext128);
  String plaintext192 = decryptAES(key192, ciphertext192);
  String plaintext256 = decryptAES(key256, ciphertext256);
  System.out.println("Plaintext 128:" + plaintext128);
  System.out.println("Plaintext 192:" + plaintext192);
  System.out.println("Plaintext 256:" + plaintext256);
 }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES加密,128-192-256,方案二 的相关文章

随机推荐

  • 学习使用flex

    会对flex做词法分析了解很多 下面我通过一个例子来详细说明如何使用flex 根据所学的词法分析内容 利用flex构造PL 0语言的词法分析器 既然是构造PL 0的词法分析器 那么我们有必要看一下pl0语言的简介和相应文法 2 PL 0语言
  • Spring Boot集成websocket

    像目前的直播 弹幕 小游戏等方面都用到了websocet进行长链接 相对于http的一次请求一次响应websocket只需要进行一次握手即长久性的建立链接进行消息互通 为什么一些场景要用websocet呢 http的请求每次都会进行校验而请
  • 0000-00-00 00:00:00 的坑,你踩了吗?

    本文内容 1 起因 2 MySQL 对 0000 00 00 的支持 3 Java 对 0000 00 00 的支持 4 为什么线上的代码能正常运行 起因 前几天组内有系统做了数据库迁移 MySQL版本 5 6 16 其中某张表的一个字段是
  • 手机共享网络给电脑解决重装windows7系统没有网卡USB驱动

    手机共享网络给电脑解决重装windows7系统没有网卡USB驱动 我的手机是荣耀手机 使用下面方法 在手机上进入设置 gt 移动网络 gt 个人热点 gt 更多共享设置 开启USB 共享网络开关 共享移动网络或已连接的WLAN 网络给电脑
  • 什么是I帧,P帧,B帧

    视频压缩中 每帧代表一幅静止的图像 而在实际压缩时 会采取各种算法减少数据的容量 其中IPB就是最常见的 简单地说 I帧是关键帧 属于帧内压缩 就是和AVI的压缩是一样的 P是向前搜索的意思 B是双向搜索 他们都是基于I帧来压缩数据 I帧表
  • Redis在数据库事务中的增改操作

    数据库事务中的redis增改模板 if TransactionSynchronizationManager isActualTransactionActive TransactionSynchronizationManager regist
  • EF系列(一)——深入框架底层

    什么是EF 框架 EF 框架是微软的 NET中ORM 对象关系映射 框架 为什么要用EF框架 在没有EF框架之前 我们是直接与ADO Net 进行交互来访问数据库 在SqlHelper 里面面通过设置connection command d
  • SpringMVC+Shiro整合配置文件详解

    在项目中xml文件的配置是必不可少的 特别是SpringMVC框架 但是几乎所有项目的配置都是大同小异 很多人都是直接复制黏贴了事 不少人对其具体含义及用途都不甚全知 本片文章将正对项目中常用的框架SpringMVC Shiro进行整合 并
  • IntelliJ IDEA / Eclipse 自动生成 Author 注释 签名

    Author 注释 签名如下 author 稚枭天卓 E mail zhxiaotianzhuo 163 com version 创建时间 2016 6 20 下午04 58 52 Eclipse 自动生成 Author 注释 签名 win
  • 4位超前进位加法器-Verilog HDL

    Verilog HDL 简介 Verilog HDL是目前设计界通常采用的一种硬件描述语言 被广泛的应用在数字ASIC和可编程逻辑器件的设计开发工作 其按照一定的规则和风格编写代码 可以从系统级 电路级 门级 开关级等抽象层次 进行数字电路
  • jbk和jre的下载与安装

    一 下载 Java可进入Oracle官网下载 点击链接进入官网 1 点击链接进入官网 点击产品 2 打开产品列表 找到java点击 3 下载java 向下滑动选择需要的java版本 以java8为例子 选择Windows版本 选择对应的64
  • 本地真机调试小程序

    1 查出电脑本地ip地址 gt ipconfig 无线局域网适配器 WLAN 连接特定的 DNS 后缀 本地链接 IPv6 地址 xxxxx IPv4 地址 192 168 0 99 子网掩码 255 255 255 0 默认网关 192
  • winxp MySQL 5.6.35 免安装版 简单配置

    Links MySQL 5 6 35 MySQL 5 6 35 32位 下载地址 Reference MySQL 5 6 13免安装版配置方法 Steps 1 解压文件 放到任意一个路径 好像不要有中文 下面 如 D iTom MySQL
  • 09 TypeError: Descriptors cannot not be created directly.

    1 问题 import yaml ModuleNotFoundError No module named yaml yaml模块的pip工具包名称不是yaml 而是pyyaml 所以不是直接pip install yaml 而是 pip i
  • 专治机器学习面试:机器学习各个算法的优缺点!

    今天有朋友聊起来 机器学习算法繁多 各个算法有各个算法的特点 以及在不同场景下 不同算法模型能够发挥各自的优点 今天呢 我把常见的 常用的算法模型进行了一个大概的总结 包括其分支以及各分支的优缺点 涉及到的算法有 回归 正则化算法 集成算法
  • 关于驱动和设备的相关的注册表键的位置,和相关信息

    关于驱动和设备的相关的注册表键的位置 和相关信息 MSDN上有了 https msdn microsoft com en us library windows hardware ff549815 v vs 85 aspx 下面是大概翻译整理
  • kettle-记录集连接(可实现左、右、全、内连接)

    连接前需先排序 记录连接集控件设置 结果 以左连接为例 连接前的两个数据源 连接后
  • 如何让input框中的值不被用户修改

    1 最常用的disabled 被禁用的 input 元素 不可编辑 不可复制 不可选择 不能接收焦点 后台也不会接收到传值 设置后文字的颜色会变成灰色 EP disabled 属性无法与 一起使用 2 readonly unselectab
  • 20220722_使用Element UI写html页面

    Element官网component资源点击这里 结构图 element ui自行下载复制到一致路径 第一个html div div
  • AES加密,128-192-256,方案二

    与方案一对比 方案二要简洁很多 看代码 package com xiao aes util import java security NoSuchAlgorithmException import javax crypto Cipher i