解密中的最后一个块未完成-Android Studio JAVA

解密中的最后一个块未完成-Android Studio JAVA,java,android-studio,encryption,Java,Android Studio,Encryption,我有一个密码字段。我想加密和解密它 因此,在SQLite中插入时,加密而不是读取时,解密它 我遵循了教程 我的加密正在工作。但我的解密不起作用 我有一份管理员名单。当我点击一个,我想看到他们的密码(解密) 下面的代码将(加密字符串)密码发送到mSyncAdminsDatabaseHelper,它得到一个decrypt()方法 在mSyncAdminsDatabaseHelper上,我有以下代码 //set key private SecretKey generateKey(String pass

我有一个密码字段。我想加密和解密它

因此,在SQLite中插入时,加密而不是读取时,解密它

我遵循了教程

我的加密正在工作。但我的解密不起作用

我有一份管理员名单。当我点击一个,我想看到他们的密码(解密)

下面的代码将(加密字符串)密码发送到mSyncAdminsDatabaseHelper,它得到一个decrypt()方法

在mSyncAdminsDatabaseHelper上,我有以下代码

//set key
private SecretKey generateKey(String password) throws Exception {
    final MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] bytes = password.getBytes("UTF-8");
    digest.update(bytes, 0, bytes.length);
    byte[] key = digest.digest();
    SecretKey secretKey = new SecretKeySpec(key, "AES");
    return secretKey;
}

//encrypt
private String encrypt(String password) throws Exception {
    SecretKey key = generateKey(password);
    Cipher c = Cipher.getInstance("AES");
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encval = c.doFinal(password.getBytes());
    String encryptedValue = Base64.encodeToString(encval, Base64.DEFAULT);
    return encryptedValue;
}

//decrypt
public String decrypt(String password) throws Exception {
    SecretKey key = generateKey(password);
    Cipher c = Cipher.getInstance("AES");
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] encval = c.doFinal(password.getBytes());
    byte[] encryptedValue = Base64.decode(encval, Base64.DEFAULT);
    String decryptedvalue = new String(encryptedValue);
    return decryptedvalue;
}
我得到以下错误

W/System.err: javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
W/System.err:     at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:1143)
        at javax.crypto.Cipher.doFinal(Cipher.java:1736)
W/System.err:     at com.example.photoapp.SyncAdminsDatabaseHelper.decrypt(SyncAdminsDatabaseHelper.java:182)
        at com.example.photoapp.SyncAdminsDatabaseHelper.test(SyncAdminsDatabaseHelper.java:190)
        at com.example.photoapp.ViewAdmins$1.onItemClick(ViewAdmins.java:100)
        at android.widget.AdapterView.performItemClick(AdapterView.java:350)
W/System.err:     at android.widget.AbsListView.performItemClick(AbsListView.java:1683)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:4094)
W/System.err:     at android.widget.AbsListView$10.run(AbsListView.java:6583)

解密前需要对密文进行base64解码,而不是解密后的明文。另外:Java中的Cipher
“AES”
将操作模式(wee-wikipedia)默认为ECB,这通常是不安全的,并且几乎不应该使用,尽管在这种情况下,使用密码的单个非盐散列作为密钥更不安全。而且,用密码本身(或者说它自己的散列)加密和解密密码是疯狂的;您需要在所有端点清除密码,因此加密版本完全没有价值,无法提供任何好处。。。。。。如果此密码用于登录系统,则根本不应加密,应存储为密码哈希而设计的不可逆(但可复制)哈希,而不是简单的数据哈希;请参阅security.SX和crypto.SX了解有关此主题的许多Qs。如果此密码用于其他用途,请联系具有安全经验或相关培训的人员,或明确说明您的要求,并在security.SX上搜索或询问。
W/System.err: javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
W/System.err:     at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:1143)
        at javax.crypto.Cipher.doFinal(Cipher.java:1736)
W/System.err:     at com.example.photoapp.SyncAdminsDatabaseHelper.decrypt(SyncAdminsDatabaseHelper.java:182)
        at com.example.photoapp.SyncAdminsDatabaseHelper.test(SyncAdminsDatabaseHelper.java:190)
        at com.example.photoapp.ViewAdmins$1.onItemClick(ViewAdmins.java:100)
        at android.widget.AdapterView.performItemClick(AdapterView.java:350)
W/System.err:     at android.widget.AbsListView.performItemClick(AbsListView.java:1683)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:4094)
W/System.err:     at android.widget.AbsListView$10.run(AbsListView.java:6583)