2014-01-21 100 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

它的工作,非常感谢! –