代碼:
import java.security.SecureRandom;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class aestest {
public static void main(String args[]) throws Exception
{
String a = "1234567890ABCDEF";
String privateK = "qqqqqqqqqqqqq";
// System.out.print( a.getBytes());
// System.out.println();
// System.out.print( privateK.getBytes());
// System.out.println();
//
// System.out.print( "toHexString : "+toHex(a));
// System.out.println();
// System.out.print( "toHexString : " +toHex(privateK));
// System.out.println();
//
// System.out.print( "toHexString and then fromHex : "+fromHex(toHex(a)));
// System.out.println();
// System.out.print( "toHexString and then fromHex : " +fromHex(toHex(privateK)));
// System.out.println();
// System.out.printf( encrypt(privateK,a));
System.out.printf( encrypt(a,privateK));
System.out.println();
// int b[] = hexstr2array(a, 4);
//
// for(int c: b)
// System.out.printf("%d ", c);
// System.out.println();
}
// public static int[] hexstr2array(String input, int length)
// {
// int[] output = new int[length];
//
// for(int i = 0; i < length; i++)
// if(i < input.length() / 2)
// output[i] = Integer.parseInt(input.substring(i*4, i*4+4), 16);
// else
// output[i] = 0;
//
// return output;
// }
public static String encrypt(String seed, String cleartext) throws Exception {
System.out.print( "input : "+seed);
System.out.println();
System.out.print( "input length : "+ seed.length());
System.out.println();
System.out.print( seed.getBytes());
System.out.println();
System.out.print( "input to Bytes length : "+seed.getBytes().length);
System.out.println();
// System.out.print(byteArray2int( seed.getBytes()));
// System.out.println();
// System.out.print( "seed.getBytes().toString() user 16 hexstr2array "+hexstr2array(seed.getBytes().toString(),16));
// System.out.println();
System.out.print( "input to Hex : "+toHex(seed));
System.out.println();
System.out.print( "input to Hex length : "+toHex(seed).length());
System.out.println();
// System.out.print( "input to Hex to 16 hexstr2array : "+hexstr2array(toHex(seed),16));
// System.out.println();
//
// System.out.print( "input to Hex to 32 hexstr2array : "+hexstr2array(toHex(seed),32));
// System.out.println();
System.out.print( "input to Hex to 64 hexstr2array : "+hexstr2array(toHex(seed),64));
System.out.println();
System.out.print( "input to Hex to 64 hexstr2arrayi : "+hexstr2arrayi(toHex(seed),64));
System.out.println();
System.out.print( "input to Hex to byte to 32 hexstr2arrayb : "+hexstr2arrayb(seed,64));
System.out.println();
// System.out.print( "user 8 hexstr2array "+hexstr2array(seed,8));
// System.out.println();
//
//
System.out.print( "user 16 hexstr2array "+hexstr2array(seed,16));
System.out.println();
//
// System.out.print( "user 32 hexstr2array "+hexstr2array(seed,32));
// System.out.println();
//
// System.out.print( "user 64 hexstr2array "+hexstr2array(seed,64));
// System.out.println();
//
// System.out.print( "user 128 hexstr2array "+hexstr2array(seed,128));
// System.out.println();
// System.out.print(byteArray2int( seed.getBytes()));
// System.out.println();
byte[] rawKey = getRawKey(seed.getBytes());
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}
//public static String decrypt(String seed, String encrypted) throws Exception {
// byte[] rawKey = getRawKey(seed.getBytes());
// byte[] enc = toByte(encrypted);
// byte[] result = decrypt(rawKey, enc);
// return new String(result);
//}
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(clear);
return encrypted;
}
//private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
// SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Cipher cipher = Cipher.getInstance("AES");
// cipher.init(Cipher.DECRYPT_MODE, skeySpec);
// byte[] decrypted = cipher.doFinal(encrypted);
// return decrypted;
//}
public static String toHex(String txt) {
///////This let input String to HEX
int i=0;
// System.out.print("run No.= "+i+ " Show input : "+txt);
// i++;
return toHex(txt.getBytes());
}
//public static String fromHex(String hex) {
// ///////This let HEX to String
// int i=0;
// System.out.print("run No.= "+i+ " Show input : "+hex);
// i++;
// return new String(toByte(hex));
//}
//public static byte[] toByte(String hexString) {
// int len = hexString.length()/2;
// byte[] result = new byte[len];
// for (int i = 0; i < len; i++)
// result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
// return result;
//}
public static String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2*buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
public static byte[] int2byteArray(int num) {
////int to byte
byte[] result = new byte[4];
result[0] = (byte)(num >>> 24);//取最高8位放到0下標
result[1] = (byte)(num >>> 16);//取次高8为放到1下標
result[2] = (byte)(num >>> 8); //取次低8位放到2下標
result[3] = (byte)(num ); //取最低8位放到3下標
return result;
}
//public static byte int2byte(int num) {
// ////int to byte
// byte result = new byte;
// result[0] = (byte)(num >>> 24);//取最高8位放到0下標
// result[1] = (byte)(num >>> 16);//取次高8为放到1下標
// result[2] = (byte)(num >>> 8); //取次低8位放到2下標
// result[3] = (byte)(num ); //取最低8位放到3下標
// return result;
//}
public static int byteArray2int(byte[] b){
////// byte to int
byte[] a = new byte[4];
int i = a.length - 1,j = b.length - 1;
for (; i >= 0 ; i--,j--) {//從b的尾部(即int值的低位)開始copy數據
if(j >= 0)
a[i] = b[j];
else
a[i] = 0;//如果b.length不足4,則將高位補0
}
int v0 = (a[0] & 0xff) << 24;//&0xff將byte值無差異轉成int,避免Java自動類型提升後,會保留高位的符號位
int v1 = (a[1] & 0xff) << 16;
int v2 = (a[2] & 0xff) << 8;
int v3 = (a[3] & 0xff) ;
return v0 + v1 + v2 + v3;
}
public static String[] hexstr2array(String input,int length) {
String[] output = new String[length];
for (int i=0; i<length; i++) {
if (i < (input.length())/2) {
int ss = Integer.parseInt(input.substring((i*2),(i*2+2)),16);
output[i] =""+ss;
} else {
output[i] = "0";
}
}
return output;
}
public static int[] hexstr2arrayi(String input,int length) {
int[] output = new int[length];
for (int i=0; i<length; i++) {
if (i < (input.length())/2) {
int ss = Integer.parseInt(input.substring((i*2),(i*2+2)),16);
output[i] = ss;
} else {
output[i] = 0 ;
}
}
return output;
}
public static byte[] hexstr2arrayb(String input,int length) {
byte[] output = new byte[length];
for (int i=0; i<length; i++) {
if (i < (input.length())/2) {
//int ss = Integer.parseInt(input.substring((i*2),(i*2+2)),16);
//output[i] = ss;
//output[i] = int2byteArray(ss);
for (int j= 0; j < length; j += 2) {
byte[] data = null;
data[j / 2] = (byte) ((Character.digit(input.charAt(j), 16) << 4)
+ Character.digit(input.charAt(j+1), 16));
}
} else {
output[i] = 0 ;
}
}
return output;
}
private final static String HEX = "0123456789ABCDEF";
private static void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}
}