2012-03-08 117 views
0

在我的项目中,我正在研究AES加密和Decryption.i已使用此算法来加密和解密一个字符串,并将字符串存储在sq-lite数据库中。现在,我从数据库中获得加密的密钥,尝试解密它,但它示出了一个异常(垫座损坏)。我是通过使用AES解密不起作用

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16));} 
    return data; 
} 

和得到正确的字节数,但将所述加密串入字节,而转换成字符串它显示“垫块损坏”。 在此先感谢。如果找到答案,真的很感激。 我的代码是

dh=new data_helper(Resy.this); 
     mac_db=dh.getData(); 

//  getdata=mac_db.toString(); 

     KeyGenerator kgen; 
     try { 
      kgen = KeyGenerator.getInstance("AES"); 

      kgen.init(128); // 192 and 256 bits may not be available 

    // Generate the secret key specs. 
       SecretKey skey = kgen.generateKey(); 
       byte[] raw = skey.getEncoded(); 

       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 


       // Instantiate the cipher 

       Cipher cipher = Cipher.getInstance("AES"); 
         getdata=mac_db.toString(); 
//    byte g1[]=getdata.getBytes(); 
//    System.out.println(g1); 

     byte b[]=hexStringToByteArray(getdata); 
     cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
     byte[] m1=cipher.doFinal(b); // here pad block corrupt exception came. 
       String originalString_mac = new String(original_macadress); 
       Toast.makeText(getApplicationContext(),"Original : " +originalString_mac + " " + asHex(original_macadress) , Toast.LENGTH_LONG).show(); 
+1

零接受拉曼,先接受你以前的问题的一些答案 - 答案很容易,但直到你接受一些答案... – 2012-03-08 14:19:41

+0

仍然不明白为什么接受解决方案如此难以接受答案。 – Niranjan 2012-05-14 06:57:11

回答

1

你必须做的是Base64编码,以获得适当的AES加密/解密工作。

按如下操作。

对于encrytion:原始字符串 - > AES加密>的base64编码--->(加密的字符串)

对于解密:加密的字符串--->的base64译码> AES解密--->原始字符串

+0

您当然不会使用Base64 - 这只是将二进制blob转换为字符串的一种方法。十六进制编码或任何可逆的东西都可以工作。 – 2012-03-08 07:27:40

2

首先确保您的数据是正确的长度,并且您的十六进制转换中没有错误。接下来,您需要使用相同的密钥进行加密和解密。从上面的代码看来,您每次都会生成一个新密钥。这将不起作用:即使解密成功,您也会得到与原始纯文本完全不同的内容。然后Cipher cipher = Cipher.getInstance("AES");可能会产生一个密码使用随机四,你需要解密。最好指定一个明确的转换字符串,如下所示:

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

总之,找到一个工作示例并从那里开始。类似this