import java.security.Key;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

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

/**

* AES安全编码组件

*/

public abstract class AESCoder {

/**

* 密钥算法

*/

public static final String KEY_ALGORITHM = "AES";

/**

* 加密/解密算法 / 工作模式 / 填充方式 Java 6支持PKCS5Padding填充方式 Bouncy

* Castle支持PKCS7Padding填充方式

*/

public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

/**

* 转换密钥

*

* @param key

*            二进制密钥

* @return Key 密钥

* @throws Exception

*/

private static Key toKey(byte[] key) throws Exception {

// 实例化AES密钥材料

SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);

return secretKey;

}

/**

* 解密

*

* @param data

*            待解密数据

* @param key

*            密钥

* @return byte[] 解密数据

* @throws Exception

*/

public static byte[] decrypt(byte[] data, byte[] key) throws Exception {

// 还原密钥

Key k = toKey(key);

/*

* 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM,

* "BC");

*/

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

// 初始化,设置为解密模式

cipher.init(Cipher.DECRYPT_MODE, k);

// 执行操作

return cipher.doFinal(data);

}

/**

* 加密

*

* @param data

*            待加密数据

* @param key

*            密钥

* @return byte[] 加密数据

* @throws Exception

*/

public static byte[] encrypt(byte[] data, byte[] key) throws Exception {

// 还原密钥

Key k = toKey(key);

/*

* 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM,

* "BC");

*/

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

// 初始化,设置为加密模式

cipher.init(Cipher.ENCRYPT_MODE, k);

// 执行操作

return cipher.doFinal(data);

}

/**

* 生成密钥 <br>

*

* @return byte[] 二进制密钥

* @throws Exception

*/

public static byte[] initKey() throws Exception {

// 实例化

KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

/*

* AES 要求密钥长度为 128位、192位或 256位,这里用128位

*/

kg.init(128);

// 生成秘密密钥

SecretKey secretKey = kg.generateKey();

// 获得密钥的二进制编码形式

return secretKey.getEncoded();

}

/**

* 将byte数组转换成16进制String

* @param buf

* @return

*/

public static String parseByte2HexStr(byte buf[]) {

StringBuffer sb = new StringBuffer();

for (int i = 0; i < buf.length; i++) {

String hex = Integer.toHexString(buf[i] & 0xFF);

if (hex.length() == 1) {

hex = '0' + hex;

}

sb.append(hex.toUpperCase());

}

return sb.toString();

}

/**

* 将16进制String转换为byte数组

* @param hexStr

* @return

*/

public static byte[] parseHexStr2Byte(String hexStr) {

if (hexStr.length() < 1)

return null;

byte[] result = new byte[hexStr.length() / 2];

for (int i = 0; i < hexStr.length() / 2; i++) {

int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);

result[i] = (byte) (high * 16 + low);

}

return result;

}

public static void main(String[] args) throws Exception {

// 初始化密钥

byte[] key = Base64.decodeBase64("Geyd4zScWAbJT9VrWr5cUQ==");

String inputStr = "TCWeb.Bank";

byte[] inputData = inputStr.getBytes();

inputData = AESCoder.encrypt(inputData, key);

String userName = Base64.encodeBase64String(inputData);

System.out.println("加密后:" + userName);

// 解密

byte[] userNameData = AESCoder.decrypt(Base64.decodeBase64(userName), key);

userName = new String(userNameData);

System.out.println("userName:" + userName);

}

}

AES加密 16进制与二进制转换的更多相关文章

  1. bgcolor RGB 和16进制之间的转换,16进制转RGB,源码

    <p>bgcolor RGB 和16进制之间的转换,16进制转RGB,源码例如:<br /> 输入 201,255,201 转换成 #C9FFC9</p> < ...

  2. C# MD5加密(16进制)

    MD5加密(16进制) vs会提示引用 using System.Security.Cryptography; 代码如下: public static string MD5Encrypt32(stri ...

  3. js AES对称加密 16进制和base64格式

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 16进制到byte转换

    我们经常会看到这样的语法 (byte) 0xAD 0xAD实际是个16进制,转换成二进制为:10101101,转换成10进制是:173,它是个正数 10101101只是int的简写,int由4个byt ...

  5. Python内置进制转换函数(实现16进制和ASCII转换)

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法. hex() 转换一 ...

  6. ASCII码与16进制的互相转换(表)

    所谓的ASCII和16进制都只是概念上的东西,在计算机中通通是二进制 转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样ASCII是针对字符的编码,几乎是键盘上的字符的编码 ...

  7. C#串口通讯中常用的16进制的字节转换

    1.对于通讯协议的十六进制数值进行简单转换 //二进制转十进制Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32(&qu ...

  8. [iOS]把16进制(#871f78)颜色转换UIColor

    // // ViewController.m // text // // Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights ...

  9. python常用的十进制、16进制之间的转换

    一 整数之间的进制转换: hex(16) # 10进制转16进制 oct(8) # 10进制转8进制 bin(8) # 10进制转2进制 二 字符串转整数 int(') # 字符串转换成10进制整数 ...

随机推荐

  1. poj 2398 (叉积+二分)

    http://poj.org/problem?id=2398 Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  2. hdu 5950 Recursive sequence 矩阵快速幂

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. 关于linux 卸载问题

    网上找了一套引擎 非用protocbuff 2.4.1 结果机器上已经装好了2.6.1 网上找了好多办法都行不通 最后终于在一个群里问到  mark一下 例如 我想卸载当前得protoc 那么 第一步 ...

  4. namespace使用总结

    1.防止引用文件中函数名相同,导致函数重定义错误: //test1.php <?php namespace foo; function func(){ echo "test1/func ...

  5. iOS - Swift available 平台判断

    前言 Swift 语言中的 @available 和 #available,Swift 2.0 中,引入了可用性的概念.对于函数,类,协议等,可以使用 @available 声明这些类型的生命周期依赖 ...

  6. js获取select字段值的方法

    var index = obj.selectedIndex; // 选中索引 var value = obj.options[index].value; // 选中值 var schoolName = ...

  7. Android_用户界面概述和数据单位

    一.UI界面概述 UI,对于一个应用而言用户界面是非常重要的一部分,是应用的脸,用户对应用第一个印象来自于界面,因此如果没有完美的用户界面,很难留住用户. 好的用户界面会极大提高用户的使用欲望并维护客 ...

  8. Mysql的一些小知识点

    MySQL简介:是由瑞典的MySQL AB公司开发的,目前是Oracle(甲骨文)公司扥一个关系型数据库产品(2008年MySQL AB公司被Sun公司收购,2009年Sun公司又被 Oracle公司 ...

  9. MySQL在windows系统中修改datadir路径后无法启动问题,报错1067

    windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents ...

  10. Webdriver - Selenium Grid Configuration

    Grid parameter: role = <hub|node> (default is no grid, just run an RC/webdriver server). When ...