AES 加密解密
- package XX.XX.XX.test;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.security.InvalidKeyException;
- import java.security.NoSuchAlgorithmException;
- import java.security.SecureRandom;
- import java.util.Scanner;
- 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 sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- public class TestAES {
- public static String encodeRules = null;
- public static String AESEncode(String content) {
- try {
- // 1.构造密钥生成器,指定为AES算法,不区分大小写
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- // 2.根据ecnodeRules规则初始化密钥生成器
- // 生成一个128位的随机源,根据传入的字节数组
- keygen.init(128, new SecureRandom(encodeRules.getBytes()));
- // 3.产生原始对称密钥
- SecretKey original_key = keygen.generateKey();
- // 4.获得原始对称密钥的字节数组
- byte[] raw = original_key.getEncoded();
- // 5.根据字节数组生成AES密钥
- SecretKey key = new SecretKeySpec(raw, "AES");
- // 6.根据指定算法AES自成密码器
- Cipher cipher = Cipher.getInstance("AES");
- // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
- cipher.init(Cipher.ENCRYPT_MODE, key);
- // 8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
- byte[] byte_encode = content.getBytes("utf-8");
- // 9.根据密码器的初始化方式--加密:将数据加密
- byte[] byte_AES = cipher.doFinal(byte_encode);
- // 10.将加密后的数据转换为字符串
- // 这里用Base64Encoder中会找不到包
- // 解决办法:
- // 在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
- String AES_encode = new String(new BASE64Encoder().encode(byte_AES));
- // 11.将字符串返回
- return AES_encode;
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- } catch (BadPaddingException e) {
- e.printStackTrace();
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- // 如果有错就返加nulll
- return null;
- }
- /*
- * 解密 解密过程: 1.同加密1-4步 2.将加密后的字符串反纺成byte[]数组 3.将加密内容解密
- */
- public static String AESDncode(String content) {
- try {
- // 1.构造密钥生成器,指定为AES算法,不区分大小写
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- // 2.根据ecnodeRules规则初始化密钥生成器
- // 生成一个128位的随机源,根据传入的字节数组
- keygen.init(128, new SecureRandom(encodeRules.getBytes()));
- // 3.产生原始对称密钥
- SecretKey original_key = keygen.generateKey();
- // 4.获得原始对称密钥的字节数组
- byte[] raw = original_key.getEncoded();
- // 5.根据字节数组生成AES密钥
- SecretKey key = new SecretKeySpec(raw, "AES");
- // 6.根据指定算法AES自成密码器
- Cipher cipher = Cipher.getInstance("AES");
- // 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
- cipher.init(Cipher.DECRYPT_MODE, key);
- // 8.将加密并编码后的内容解码成字节数组
- byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
- /*
- * 解密
- */
- byte[] byte_decode = cipher.doFinal(byte_content);
- String AES_decode = new String(byte_decode, "utf-8");
- return AES_decode;
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (NoSuchPaddingException e) {
- e.printStackTrace();
- } catch (InvalidKeyException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (IllegalBlockSizeException e) {
- e.printStackTrace();
- } catch (BadPaddingException e) {
- e.printStackTrace();
- }
- // 如果有错就返加nulll
- return null;
- }
- public static void main(String[] args) {
- TestAES.encodeRules = "秘钥秘钥密码";
- while (true) {
- Scanner scanner = new Scanner(System.in);
- System.out.println("请输入要加密的内容:");
- String content = scanner.next();
- String mm = TestAES.AESEncode(content);
- System.out.println("根据输入的规则" + encodeRules + "加密后的密文是:\r\n" + mm);
- System.out.println("根据输入的规则" + encodeRules + "解密后的明文是:\r\n" + TestAES.AESDncode(mm));
- }
- }
- }
AES 加密解密的更多相关文章
- 非对称技术栈实现AES加密解密
非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的 ...
- C#中使用DES和AES加密解密
C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...
- ruby AES加密解密
最近和京东合作做一个项目,在接口对接传递参数时,参数需要通过AES加密解密. 本来想到用gem 'aescrypt'处理,但是aescrypt的编码方式用的base64,而京东那边用的是16进制.所以 ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
- java使用AES加密解密 AES-128-ECB加密
java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...
- AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用
一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...
- AES加密解密 助手类 CBC加密模式
"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...
- php与java通用AES加密解密算法
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...
- Java 关于密码处理的工具类[MD5编码][AES加密/解密]
项目中又遇到了加密问题,又去翻了半天,然后做测试,干脆就把常用的两类小结一下. 1.第一种所谓的MD5加密 其实也不算加密,只是基于Hash算法的不可逆编码而已,等于说,一旦经过MD5处理,是不可能从 ...
随机推荐
- mktemp---创建暂存文件
- Python修改文件内容
工作中要写个脚本来修改文件的内容,然后就写了一个刷子: #coding:utf8 import os def modify_file(old_file, new_version, old_versio ...
- Mysql学习总结(13)——使用JDBC处理MySQL大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- iOS Dev (51)加急审核
https://developer.apple.com/appstore/contact/? topic=expedite
- codeforces 1037E. Trips(倒叙)
题目传送门: 解题思路: 正着搞好像有点恶心. 反着搞. 一边删一边搞,从崩坏的地方开始,入度--. 最后dfs崩坏,更新答案. 注意要把边删掉防止重复崩坏. 代码: #include<cstd ...
- PYTHON学习第五天课后总结:
今日重点: 数字类型 字符串类型 列表类型 元组类型 1,数字类型 数字类型为不可变类型 也只能将纯数字类型的字符串转换成int包括: 整型: int() int() 为内置函数,可 ...
- MySQL集群搭建详解
概述 MySQL Cluster 是MySQL 适合于分布式计算环境的高实用.可拓展.高性能.高冗余版本,其研发设计的初衷就是要满足许多行业里的最严酷应用要求,这些应用中经常要求数据库运行的可靠性要达 ...
- 有关 Lambda && linq练习 有待整理
1. 查询Student表中的所有记录的Sname.Ssex和Class列.(select sname,ssex,class from student) Students.Select(s=> ...
- HDU 4869 Turn the pokers(思维+组合公式+高速幂)
pid=4869" target="_blank">Turn the pokers 大意:给出n次操作,给出m个扑克.然后给出n个操作的个数a[i],每一个a[i] ...
- Delphi部份函数,命令,属性中文说明
Abort 函数 引起放弃的意外处理 Abs 函数 绝对值函数 AddExitProc 函数 将一过程添加到运行时库的结束过程表中 Addr 函数 返回指定对象的地址 AdjustLineBreaks ...