2012-03-08 127 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