文档章节

Java中AES加密解密以及签名校验

吕兵阳
 吕兵阳
发布于 2017/09/10 21:09
字数 494
阅读 41
收藏 0
点赞 0
评论 0
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

/**
 * Created by Lb on 2017/9/10.
 */
public class AESCoder {

  //密钥算法
  public static final String KEY_ALGORITHM = "AES";
  //工作模式,填充模式
  public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

  /**
   * 转换密钥
   *
   * @param key 二进制密钥
   * @return Key密钥
   */
  private static Key toKey(byte[] key) {
    SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);
    return secretKey;
  }

  /**
   * 解密
   */
  public static byte[] decrpyt(byte[] data, byte[] key)
      throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    //还原密钥
    Key k = toKey(key);
    //实例化
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    //初始化
    cipher.init(Cipher.DECRYPT_MODE, k);
    //执行操作
    return cipher.doFinal(data);
  }

  /**
   * 加密
   */
  public static byte[] encrypt(byte[] data, byte[] key)
      throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    //还原密钥
    Key k = toKey(key);
    //实例化
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    //初始化
    cipher.init(Cipher.ENCRYPT_MODE, k);
    //执行操作
    return cipher.doFinal(data);
  }

  /**
   * 生成密钥
   */
  public static byte[] initKey() throws NoSuchAlgorithmException {
    //实例化
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
    //AES 要求密钥长度为128位、192位或256位
    keyGenerator.init(128);
    //生成秘密密钥
    SecretKey secretKey = keyGenerator.generateKey();
    //获取密钥的二进制编码形式
    return secretKey.getEncoded();
  }

  /**
   * 初始化密钥
   *
   * @return Base64编码密钥
   */
  public static String initKeyString() throws NoSuchAlgorithmException {
    return Base64.encodeBase64String(initKey());
  }

  /**
   * 获取密钥
   */
  public static byte[] getKey(String key) {
    return Base64.decodeBase64(key);
  }

  /**
   * 解密
   *
   * @param data 待解密数据
   * @param key 密钥
   * @return byte[] 解密数据
   */
  public static byte[] decrypt(byte[] data, String key)
      throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
    return decrpyt(data, getKey(key));
  }

  /**
   * 加密
   *
   * @param data 待加密数据
   * @param key 密钥
   * @return byte[]加密数据
   */
  public static byte[] encrypt(byte[] data, String key)
      throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
    return encrypt(data, getKey(key));
  }

  /**
   * 摘要处理
   *
   * @param data 待摘要数据
   * @return 摘要字符串
   */
  public static String shaHex(byte[] data) {
    return DigestUtils.md5Hex(data);
  }

  /**
   * 验证
   *
   * @param data 待摘要数据
   * @param messageDigest 摘要字符串
   * @return 验证结果
   */
  public static boolean vailidate(byte[] data, String messageDigest) {
    return messageDigest.equals(shaHex(data));
  }

  public static void main(String[] args)
      throws NoSuchAlgorithmException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {
    String inputStr = "AES18803696960http://www.baidu;com";
    byte[] inputData = inputStr.getBytes();
    System.out.println("原文:" + inputStr);
    //初始化密钥
    byte[] key = AESCoder.initKey();
    System.out.println("密钥:" + Base64.encodeBase64String(key));
    //加密
    inputData = AESCoder.encrypt(inputData, key);
    System.out.println("加密后:" + Base64.encodeBase64String(inputData));
    //解密
    byte[] outputData = AESCoder.decrpyt(inputData, key);
    String outputStr = new String(outputData);
    System.out.println("解密后:" + outputStr);

    System.out.println("校验签名:" + AESCoder.vailidate(inputData, AESCoder.shaHex(inputData)));

  }


}

© 著作权归作者所有

共有 人打赏支持
吕兵阳
粉丝 81
博文 274
码字总数 104949
作品 0
郑州
后端工程师
Android外部文件加解密及应用实践

有这样的应用场景,当我们把一些重要文件放到asset文件夹中时,把.apk解压是可以直接拿到这个文件的,一些涉及到重要信息的文件我们并不想被反编译拿去,这个时候需要先对文件进行加密,然后...

C6C ⋅ 05/08 ⋅ 0

Java开发必须要掌握的加密方式。

第一种类型加密方式:数字摘要(不可逆) 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash函数对消息进行计算而产生。 注:这个串有固定的长度,且不...

java高级架构牛人 ⋅ 06/12 ⋅ 0

整理的AES对称加密和RSA非对称加密

项目用到这两个加密方法,就整理了下做了个demo,这里也贴出来代码供参考 AES加密解密 public class AESUtil { 生成AES密钥 @param strkey @return @throws Exception AES加密,传入需要加密...

andrewniu ⋅ 05/11 ⋅ 0

基于ClassLoader的java代码加密的经验分享

原理就是 生成项目时将待加密的java class文件通过加密算法转换生成加密的二进制文件,此文件不会被JD-GUI等反编译工具直接解密。 项目在启动时,用自定义的ClassLoader将加密的二进制文件进...

hxt168 ⋅ 06/06 ⋅ 0

微信小程序开发实战1:通过shareTicket获取分享群的OpenGId

玩过微信小程序的都知道,如果有群排行就必然要获取群的唯一id(OpenGId)。 但是OpenGId的获取必须通过加密数据:encryptedData、加密向量iv获取,对于encryptedData的解密微信官方提供了P...

qicong88 ⋅ 05/18 ⋅ 0

Android JNI学习(三)——Java与Native相互调用

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

java加密解密与数字证书的操作

1 Java程序实现密钥库的维护 1.1 Java程序列出密钥库所有条目 import java.util.; import java.io.; import java.security.*; public class ShowAlias{ public static void main(String arg......

happyhuangjinjin ⋅ 04/24 ⋅ 0

SpringBoot 整合 oauth2(五)实现 jwt 及 扩展

什么是jwt,即 json web token。JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。也是一种token,但是和token有一些不同。 jwt优点: 自包含 防篡改 可自定义扩展 JW...

FantJ ⋅ 05/22 ⋅ 0

Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神 ⋅ 05/08 ⋅ 0

Common Gui Tools 1.4 发布,Java GUI 实用小工具集

Java GUI实用小工具集 Common Gui Tools 新增:二维码生成解析、时间戳转换、Json格式化、文本文件切分等。 Common Gui Tools 是用java编写,GUI界面的实用小工具集,1.4版有20个小工具: 1,...

bs2004 ⋅ 04/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 22分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 35分钟前 ⋅ 0

Istio-快速安装

Istio是一个服务网格(Service Mesh)软件,可以在Kubernetes中快速安装: 1、创建配置文件 helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/is......

openthings ⋅ 36分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 41分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 41分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 46分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 58分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 今天 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部