1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.SecureRandom;
  4.  
  5. import javax.crypto.BadPaddingException;
  6. import javax.crypto.Cipher;
  7. import javax.crypto.IllegalBlockSizeException;
  8. import javax.crypto.KeyGenerator;
  9. import javax.crypto.NoSuchPaddingException;
  10. import javax.crypto.SecretKey;
  11. import javax.crypto.spec.SecretKeySpec;
  12.  
  13. public class MyKeyGenerator {
  14.  
  15. public static void main(String[] args) {
  16. try {
  17. String word = "要加密的";
  18. String ALGORITHM="AES";
  19. System.out.println(byteToHexString(word.getBytes()));
  20. KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
  21. keyGenerator.init(128,new SecureRandom()); //默认是128 AES要求密钥长度为128,192,256位
  22. SecretKey secretKey = keyGenerator.generateKey(); //生成密钥
  23. byte[] bytes = secretKey.getEncoded();
  24.  
  25. String key = byteToHexString(bytes);
    //String key = HexBin.encode(bytes);
  26. System.out.println("16进制的密钥:"+key);
  27. //String key2 = toHexString(bytes);
  28. //System.out.println(key2);
  29. //AES加密
  30. SecretKey secretKey2 = new SecretKeySpec(hexStringToBytes(key), ALGORITHM);
  31. Cipher cipher = Cipher.getInstance(ALGORITHM);
  32. cipher.init(Cipher.ENCRYPT_MODE, secretKey2);
  33. byte[] cipherByte = cipher.doFinal(word.getBytes()); //加密
  34.  
  35. String result = byteToHexString(cipherByte);
  36. System.out.println("AES加密结果:"+result);
  37.  
  38. //AES解密
  39. SecretKey secretKey3 = new SecretKeySpec(hexStringToBytes(key), ALGORITHM);//恢复密钥
    //SecretKey secretKey2 = new SecretKeySpec(HexBin.decode(key), ALGORITHM);
  40. Cipher cipher2 = Cipher.getInstance(ALGORITHM);//Cipher完成加密或解密工作类
  41. cipher2.init(Cipher.DECRYPT_MODE, secretKey3);//对Cipher初始化,解密模式
  42. byte[] cipherByte2 = cipher2.doFinal(hexStringToBytes(result));//解密data
  43.  
  44. System.out.println("AES解密结果:"+byteToHexString(cipherByte2));
  45.  
  46. System.out.println(new String(cipherByte2));
  47.  
  48. } catch (NoSuchAlgorithmException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. } catch (NoSuchPaddingException e) {
  52. // TODO Auto-generated catch block
  53. e.printStackTrace();
  54. } catch (InvalidKeyException e) {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. } catch (IllegalBlockSizeException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. } catch (BadPaddingException e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. }
  64.  
  65. }
  66.  
  67. /**
  68. * byte数组转化为16进制字符串
  69. * @param bytes
  70. * @return
  71. */
  72. public static String byteToHexString(byte[] bytes) {
  73. StringBuffer sb = new StringBuffer();
  74. for (int i = 0; i < bytes.length; i++) {
  75. String strHex=Integer.toHexString(bytes[i]);
  76. if(strHex.length() > 3) {
  77. sb.append(strHex.substring(6));
  78. } else {
  79. if(strHex.length() < 2) {
  80. sb.append("0" + strHex);
  81. } else {
  82. sb.append(strHex);
  83. }
  84. }
  85. }
  86. return sb.toString();
  87. }
  88.  
  89. /**
  90. * 16进制字符串转为byte数组
  91. * @param hexString
  92. * @return
  93. */
  94. public static byte[] hexStringToBytes(String hexString) {
  95. if (hexString == null || hexString.equals("")) {
  96. return null;
  97. }
  98. hexString = hexString.toUpperCase();
  99. int length = hexString.length() / 2;
  100. char[] hexChars = hexString.toCharArray();
  101. byte[] d = new byte[length];
  102. for (int i = 0; i < length; i++) {
  103. int pos = i * 2;
  104. d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
  105. }
  106. return d;
  107. }
  108.  
  109. private static byte charToByte(char c) {
  110. return (byte) "0123456789ABCDEF".indexOf(c);
  111. }
  112.  
  113. }

  

JAVA AES加密解密的更多相关文章

  1. C# 实现 JAVA AES加密解密[原创]

    以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...

  2. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  3. Java AES加密解密工具 -- GUI 、在线传输文件

    原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下:     (1)将128位AES ...

  4. C#与Java AES 加密解密

    参考文档:https://www.cnblogs.com/xbzhu/p/7064642.html 前几天对接Java接口,需要C#加密参数,Java解密.奈何网上找了一堆大同小异的加解密方法都跟Ja ...

  5. java AES 加密解密工具(Advanced Encryption Standard)发现明文相同但每次重启服务后密文就会不同于是有了改进

    1.通用方法 package com.qlkj.hzd.commom.utils; import javax.crypto.*; import java.io.UnsupportedEncodingE ...

  6. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  7. java使用AES加密解密 AES-128-ECB加密

    java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...

  8. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

  9. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

随机推荐

  1. 函数指针做函数参数,其中有typedef的相关,感觉这是构成大河的小溪

    #include<stdio.h> #include<stdlib.h> #include<string.h> int Funcadd(int a, int b) ...

  2. react中使用antd Table组件滚动加载数据的实现

    废话不多说,直接上代码.一目了然. import React, { Component } from "react"; import { Table } from "an ...

  3. h5手机端禁止缩放问题

    最近测试html5页面,发现默认都允许用户缩放页面,或者在屏幕双击放大或缩小.即相当于这样设置 <meta name="viewport" content="wid ...

  4. Linux上部署多个tomcat端口设置

    在Linux上部署多个tomcat主要是防止端口冲突的问题, tomcat服务器需配置三个端口才能启动,安装时默认启用了这三个端口,当要运行多个tomcat服务时需要修改这三个端口,不能相同.端口一: ...

  5. mybatis的update使用选择

    更新后台设置时,会分多个页面更新同一个表中的数据,愿想是尽量减少sql请求数据量并且减少重复代码. 比如博客园的: 假如只有一个用户信息表,这样的话每个页面只更新部分字段. 这种情况下的更新推荐在xm ...

  6. redis集群搭建教程(以3.2.2为例)

    redis从3.0版本开始支持集群,2.X版本主支持sentinel主从模式:所以要搭建集群务必下载3.0以上版本,本教程以3.2.2版本为例. redis集群最少要有3个主节点,最典型的是3主3从组 ...

  7. Linux只下载不安装软件包

    有时我们并不需要安装软件而只要下载软件包. 包格式 命令 命令所属包 命令下载格式 rpm yumdownloader yum-utils yumdownloader package_name deb ...

  8. hash与平衡二叉树的区别

    哈希表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 https://blog.csdn.net/duan19920101/article/det ...

  9. 一款c语言实现的赛车游戏

    博主学习c语言已经有一段时间了,出于对自己学习检验的目的,自制了一款c语言赛车游戏. 由于本质是检验和尝试,所以并没有注重游戏的界面.下文是开发文档,在博主的github网页可以下载源码,注意本项目使 ...

  10. React中禁止chrome填充密码表单

    当 input 的 type="password" 时,chrome浏览器会以 type="password" 为标识记住输入的用户名和密码, 如果chrome ...