2013-03-28 38 views
1

我有3类:Android的AES加密错误垫座损坏

  1. AESCrypt
  2. ChooseMasterPasswordActivity
  3. UnlockPocketActivity

我成功地将数据添加到SQLite数据库,但我有解密问题数据库中的数据。

我得到这个错误:

W/System.err(1034): javax.crypto.BadPaddingException: pad block corrupted. 

在我使用此代码加密的文本添加到SQLite数据库ChooseMasterPasswordActivity类。

String masterKey, encryptedMPW; 
     masterKey = tvPassword.getText().toString(); 

     AESCrypt aes = new AESCrypt(); 
     encryptedMPW = aes.encrypt(masterKey); 

     user = new User(null, encryptedMPW); 
     userDao.insert(user); 

在类UnlockPocketActivity我有方法createMasterPassword()与此代码:

private void checkMasterPassword() throws Exception { 

    String pw = tvUnlockMPW.getText().toString(); 
    String decryptedMPW; 

    AESCrypt aes = new AESCrypt(); 

    decryptedMPW = aes.decrypt(map.get("MPW").toString()); 



    if (pw.equals(decryptedMPW)) { 
     Intent i = new Intent(UnlockPocketActivity.this, 
       MainListActivity.class); 
     startActivity(i); 
    } else { 
     Toast.makeText(getApplicationContext(), "Pogresna sifra...", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

我用于CLAS AESCrypt此代码:

公共类AESCrypt {

private final Cipher cipher; 
private final SecretKeySpec key; 
private AlgorithmParameterSpec spec; 
private String encryptedText, decryptedText; 
private String password = "PASSWORD"; 

public AESCrypt() throws Exception { 

    // hash password with SHA-256 and crop the output to 128-bit for key 
    MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
    digest.update(password.getBytes("UTF-8")); 
    byte[] keyBytes = new byte[16]; 
    System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length); 

    cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    key = new SecretKeySpec(keyBytes, "AES"); 
    spec = getIV(); 
    } 

public AlgorithmParameterSpec getIV() { 
    AlgorithmParameterSpec ivspec; 
    byte[] iv = new byte[cipher.getBlockSize()]; 
    new SecureRandom().nextBytes(iv); 
    ivspec = new IvParameterSpec(iv); 
    return ivspec; 
    } 

public String encrypt(String plainText) throws Exception {  
    cipher.init(Cipher.ENCRYPT_MODE, key, spec); 
    byte[] encrypted = cipher.doFinal(plainText.getBytes()); 
    encryptedText = Base64.encodeToString(encrypted, Base64.DEFAULT); 
    return encryptedText; 
} 

public String decrypt(String cryptedText) throws Exception { 
    cipher.init(Cipher.DECRYPT_MODE, key, spec); 
    byte[] bytes = Base64.decode(cryptedText, Base64.DEFAULT); 
    byte[] decrypted = cipher.doFinal(bytes); 
    decryptedText = new String(decrypted, "UTF-8"); 
    return decryptedText; 
} 

}

回答

2

您似乎使用SecureRandom()来初始化您的初始化向量,它会在每次调用时产生不同的数据。

byte[] iv = new byte[cipher.getBlockSize()]; 
new SecureRandom().nextBytes(iv); 
ivspec = new IvParameterSpec(iv); 

加密和解密时初始化向量需要相同。将初始化向量与加密的数据一起保存,或者找到生成它的方法,以便在加密和解密时获得相同的结果。它不需要是保密的,但它应该与你加密的每一件新事物有所不同。

+0

谢谢,这解决了我的问题。 – Zookey