2012-02-24 49 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

相关问题