Android AES加密错误Pad块已损坏

Android AES加密错误Pad块已损坏,android,encryption,cryptography,aes,Android,Encryption,Cryptography,Aes,我有三门课: 七叶草 ChooseMasterPasswordActivity 解锁活动 我成功地将数据添加到SQLite数据库,但在从数据库解密数据时遇到问题 String masterKey, encryptedMPW; masterKey = tvPassword.getText().toString(); AESCrypt aes = new AESCrypt(); encryptedMPW = aes.encrypt(masterKe

我有三门课:

  • 七叶草
  • 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);
    
    我得到这个错误:

     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:

    公共类七层密码{

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

    }

    您似乎用
    SecureRandom()
    初始化了初始化向量,它在每次调用中生成不同的数据

    byte[] iv = new byte[cipher.getBlockSize()];
    new SecureRandom().nextBytes(iv);
    ivspec = new IvParameterSpec(iv);
    
    初始化向量在加密和解密时需要相同。将初始化向量与加密数据一起保存,或者找到生成它的方法,以便在加密和解密时获得相同的结果。它不需要是秘密的,但它应该与您加密的每个新事物不同