瀏覽單個文章
公不
*停權中*
 

加入日期: Dec 2010
文章: 341
改了java檔先測試

因為網路那個SimpleCrypto要的是 byte []

所以我把hexstr2array改成byte[]輸出

可是目前都會 NullPointerException

請幫我看看哪邊改錯了

謝謝


代碼:
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));
}
	

}
舊 2014-06-22, 11:22 PM #20
回應時引用此文章
公不離線中