Android AES加密错误键块已损坏

时间:2013-03-28 18:16:23

标签: android encryption cryptography aes

我有3个班级:

  1. AESCrypt
  2. ChooseMasterPasswordActivity
  3. UnlockPocketActivity
  4. 我成功地将数据添加到SQLite数据库,但是我在解密数据库中的数据方面存在问题。

    我收到此错误:

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

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

    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;
    }   
    

    }

1 个答案:

答案 0 :(得分:2)

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

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

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