2014-01-21 216 views
0

我試圖用java加密字段,但是我無法解密它。解密AES中的AES加密字段

我沒有發送數據,我只是想在插入時加密,在檢索時解密。

我用這個代碼但解密不起作用。

public void setkey() throws Exception { 
    byte[] key1 = new String("abcd").getBytes("UTF-8"); // some logic will replace "abcd" 
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); 
    key1 = messageDigest.digest(key1); 
    key1 = Arrays.copyOf(key1,16); 
    key = key1; 
    //this key must be the same when encrypting and decrypting, right? 
} 

@Override 
public String encryptField(Myclass myClass) throws Exception { 

    Cipher cipher = Cipher.getInstance("AES"); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
    String encryptedField = Base64.encodeBase64String(cipher.doFinal(myClass.myField.getBytes("UTF-8"))); 
    myClass.setMyField(encryptedField); 
    save(myClass); 

    return encryptedField; 
    //this looks OK, and gives me 24 character string. 
} 


@Override 
public String decryptVoucher(Myclass myClass) throws Exception { 

    String skey = key.toString(); 
    Cipher cipher = Cipher.getInstance("AES"); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); 
    byte[] decryptedField = cipher.doFinal(Base64.decodeBase64(yClass.myField.getBytes("UTF-8"))); 
    // decryptedField.toString() is not as same as original data... 
    return decryptedField.toString(); 
} 

PS:我已經搜索並閱讀thisthis,其實我在這裏有他們的幫助。

回答

1

問題是您正在調用字節數組上的toString方法。 toString爲您提供了數組對象的字符串表示形式;它不會嘗試將數組的內容轉換爲字符串。你看到的輸出是沿着「[B @ 798b429b」,對嗎?

要將解密的字節轉換爲字符串對象,請使用new String(decryptedField, "UTF-8")。這將正確地將字節轉換爲字符。

請記住,Java無法知道字節數組包含表示字符的數據。 Array類中的toString方法返回數組的描述,而不是其內容。它使用默認toString實現,它是:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

(從http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString%28%29

在這種情況下,類名是 「[B」 意爲 「字節的數組」。

+0

它的工作,非常感謝! –