2012-02-24 363 views
1

我想加密的整數值,其是長近40至50個字符。我使用AES加密,但它給我錯誤,因爲整數值應該是16字節長。請參閱我的代碼如下:AES加密給錯誤作爲IV應爲16個字節長

public class MCrypt { 

private String iv ;//Dummy iv (CHANGE IT!) 
private IvParameterSpec ivspec; 
private SecretKeySpec keyspec; 
private Cipher cipher; 

private String SecretKey = "khaleed";//Dummy secretKey (CHANGE IT!) 

public MCrypt(String firstpar1) 
{ 
    iv=firstpar1;//firstpar1 can be aroung 40-50 characters long 

     ivspec = new IvParameterSpec(iv.getBytes()); 

     keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES"); 

     try { 
       cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     } catch (NoSuchAlgorithmException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     } 
     System.out.println(6666); 
} 

public byte[] encrypt(String text) throws Exception 
{ 
     if(text == null || text.length() == 0) 
       throw new Exception("Empty string"); 

     byte[] encrypted = null; 

     try { 
       cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); 

       encrypted = cipher.doFinal(padString(text).getBytes()); 
     } catch (Exception e) 
     {      
       throw new Exception("[encrypt] " + e.getMessage()); 
     } 

     return encrypted; 
} 

public byte[] decrypt(String code) throws Exception 
{ 
     if(code == null || code.length() == 0) 
       throw new Exception("Empty string"); 

     byte[] decrypted = null; 

     try { 
       cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); 

       decrypted = cipher.doFinal(hexToBytes(code)); 
     } catch (Exception e) 
     { 
       throw new Exception("[decrypt] " + e.getMessage()); 
     } 
     return decrypted; 
} 



public static String bytesToHex(byte[] data) 
{ 
     if (data==null) 
     { 
       return null; 
     } 

     int len = data.length; 
     String str = ""; 
     for (int i=0; i<len; i++) { 
       if ((data[i]&0xFF)<16) 
         str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF); 
       else 
         str = str + java.lang.Integer.toHexString(data[i]&0xFF); 
     } 
     return str; 
} 


public static byte[] hexToBytes(String str) { 
     if (str==null) { 
       return null; 
     } else if (str.length() < 2) { 
       return null; 
     } else { 
       int len = str.length()/2; 
       byte[] buffer = new byte[len]; 
       for (int i=0; i<len; i++) { 
         buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16); 
       } 
       return buffer; 
     } 
} 



private static String padString(String source) 
{ 
    char paddingChar = ' '; 
    int size = 16; 
    int x = source.length() % size; 
    int padLength = size - x; 

    for (int i = 0; i < padLength; i++) 
    { 
      source += paddingChar; 
    } 

    return source; 
} 
} 

任何建議將是偉大的。

回答

1

不要創建自己的填充,用「PKCS5Padding」,而不是「NoPadding」。確保你的(字符)編碼符合規範,並且你的IV是隨機的,塊大小和包含在密文中。如果您的密鑰是字符串,請使用基於密碼的加密。

+0

任何從我的答案失蹤,達達? – 2012-03-08 20:10:40

相關問題