此代码在 android 6.0 之前运行良好,但如果加密文件大小小于约 1k 字节,则会在 6.0 上出现错误。
public static byte[] decode(byte[] decrypteSrcBuffer) throws Exception {
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(mKeyBytes);
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
byte[] decryptData = cipher.doFinal(decrypteSrcBuffer);
return decryptData;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT
at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
at com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER.doFinalInternal(OpenSSLCipher.java:568)
at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:350)
at javax.crypto.Cipher.doFinal(Cipher.java:2056)
Run Code Online (Sandbox Code Playgroud) encryption android badpaddingexception android-6.0-marshmallow
这是测试人员:
public class CryptographySimpleTests extends ActivityTestCase
{
public void testsCryptographyClass_encryptAndDecrypt()
{
final String orgVal = "hi world! :D";
final String key = "key";
try
{
final byte[] encryptKey = Cryptography.deriveAES256Key(key);
final byte[] decryptKey = Cryptography.deriveAES256Key(key);
//Deviation method
Assert.assertTrue(Arrays.equals(encryptKey, decryptKey));
byte[] encrypted = Cryptography.encryptAES(encryptKey, orgVal.getBytes());
Assert.assertFalse(Arrays.equals(encrypted, orgVal.getBytes()));
byte[] decrypted = Cryptography.decryptAES(decryptKey, encrypted);
Assert.assertTrue(Arrays.equals(orgVal.getBytes(), decrypted));
}
catch (Exception e) {
Assert.fail(e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于最后一个断言而失败:
Assert.fail(e.getMessage());
Run Code Online (Sandbox Code Playgroud)
尝试执行时:
byte[] decrypted = Cryptography.decryptAES(decryptKey, encrypted);
Run Code Online (Sandbox Code Playgroud)
给出这个堆栈跟踪:
javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
at …Run Code Online (Sandbox Code Playgroud) 问题可能很长,但我将尝试详细描述。
这是一个演示有像我一样的问题。
我有一个Android应用程序,我想添加一个功能,该功能允许用户加密和保存其密码到SharedPreferences中,并从SharedPreferences中读取和解密它们。仅在注册了指纹并且可以将指纹有效用作获取这些密码的验证方式时才可用。
何时存储:
- 用户输入密码
- 通过由AndroidKeyStore生成的SecretKey创建加密模式密码
public Cipher getEncryptCipher() {
try {
Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
+ KeyProperties.BLOCK_MODE_CBC + "/"
+ KeyProperties.ENCRYPTION_PADDING_PKCS7);
mKeyStore.load(null);
SecretKey key = (SecretKey) mKeyStore.getKey(KEY_NAME, null);
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher;
} catch (Exception e) {
throw new RuntimeException("Failed to encrypt pin ", e);
}
}
Run Code Online (Sandbox Code Playgroud)
- FingerprintManager验证密码(密码A)并获得真实的加密密码(密码B)
//mCryptoObject is generated by cipher in step 2
mFingerprintManager.authenticate(mCryptoObject, mCancellationSignal, 0 /* flags */, FingerprintManager.AuthenticationCallback, null);
//in FingerprintManager.AuthenticationCallback
javax.crypto.Cipher cipher = result.getCryptoObject().getCipher();
Run Code Online (Sandbox Code Playgroud)
- 指纹管理器支持的密码(密码B)的加密密码
- 将加密的密码和密码iv存储在SharedPreferences中
//In my app, …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试LibGDX开发,并且我试图在我的Android手机上运行最基本的应用程序时遇到错误,因为我的密钥库存在一些问题或者它是如何被使用的,我不是确切到底是什么问题.
在此之前,我将更详细地描述问题以及我尝试过的内容,我将首先介绍一些有关我的环境的内容:
我在用:
- `Android Studio 3.1.4,` with
- `Gradle 4.6` inside of it, my os is
- `Linux Mint 18.1 (Serena) (which is based on...
- `Ubuntu 16.04`, my kernel is
- `Linux 4.4.0-53-generic`.
Run Code Online (Sandbox Code Playgroud)
在尝试解决这个问题时,我已经生成了一个新的keypass很多时间s, sometimes using the command line, and sometimes through Android Studio's "Build" -> "Generate Signed APK" -> "Create New..."选项.
我生成的最新版本是使用该Build" -> "Generate Signed SPK" -> "Create New..."选项
然后经过了很多努力,我终于意识到我必须将我的密钥库添加到我的gradle文件中,这是我做错的第一件事,我最终偶然发现了"File" -> "Project Structure" -> "android" -> "Signing"选项,点击绿色"+"符号并填写一个名称,"密钥别名","密钥密码","存储文件"和"存储密码",确保它们与我创建的最新密钥通道匹配.
在创建签名之后,我选择了它,然后点击"确定",然后在我的gradle文件中看到了这个,它被添加到我的gradle android模块中
我用我的应用程序重新同步了gradle文件,然后清理了我的应用程序.
但是,当我尝试重建我的应用程序,或者运行它并单击通过我插入的Android手机运行它的选项时,我收到错误消息: …
android keystore android-keystore badpaddingexception android-studio
在Android/Java应用程序中,
byte[] data = ":ʺ$jhk¨ë‹òºÃ"; // fetched from php server..
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
return new String(cipher.doFinal(data));
Run Code Online (Sandbox Code Playgroud)
上面的代码总是抛出BadPaddingException: pad block corrupted以下16字节的加密数据
data =":ʺ$jhk¨ë<òºÃ"(数据为16个字符)
密钥长度为16个字节.
当数据已经是块的大小时,为什么会抛出此异常.并且不需要填充.
注意:加密数据是从php服务器获取的.
改变后
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
的
Cipher cipher = Cipher.getInstance("AES");
decrypt方法成功,但是给出了这个输出

我已经编写了一个简单的Java AES加密和解密,如下所示(用于学习目的):
//Encryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String encryptedString = Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes()));
return encryptedString;
//Decryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
String decryptedString = new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt)));
return decryptedString;
Run Code Online (Sandbox Code Playgroud)
密码密钥是一个可变长度的字符串,我MD5散列该字符串以获得128位密钥.
我可以使用相同的密钥成功加密和解密数据.但如果我用错误的密钥解密数据,我得到以下例外:
javax.crypto.BadPaddingException: Given final block not properly padded
Run Code Online (Sandbox Code Playgroud)
实际上我所期望的是,错误的密钥解密产生了错误的字节,但没有像上面那样抛出异常,因为如果产生错误的字节,黑客可能不知道解密是否正确.如果像上面那样抛出异常,蛮力的输出将变得更容易确定.
那么,我的代码会发生什么?
编辑:
我想我在这里弄错了.黑客可能不会使用我的程序来解密.因此,对于AES,如果一个人解密失败,他会知道解密失败但不是因为我认为从解密中获取错误的字节?这很糟糕...
我想加密然后解密文件使用AES.我读过很多关于错误的话题"Given final block not properly padded".但我没有为我找到解决方案.
抱歉指定我的代码语言,我不懂java语言
这是我的代码:
变量
// IV, secret, salt in the same time
private byte[] salt = { 'h', 'u', 'n', 'g', 'd', 'h', '9', '4' };
public byte[] iv;
public SecretKey secret;
Run Code Online (Sandbox Code Playgroud)
createSecretKey
public void createSecretKey(String password){
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
secret = new SecretKeySpec(tmp.getEncoded(), "AES");
}
Run Code Online (Sandbox Code Playgroud)
方法加密
public void encrypt(String inputFile){
FileInputStream fis = new FileInputStream(inputFile);
// Save file: inputFile.enc …Run Code Online (Sandbox Code Playgroud) 我正在尝试加密和解密我的文件,其中所有密码都使用 AES 存储。
该算法在加密部分运行良好。但是在解密时它会抛出错误
Message:Given final block not properly padded
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2121)
at SearchDoc.dec_file(SearchDoc.java:327)
at SearchDoc.access$100(SearchDoc.java:52)
at SearchDoc$2$1.actionPerformed(SearchDoc.java:227)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud)