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