Java 安卓加密“;“垫块损坏”;例外
在此代码中,此行导致异常:Java 安卓加密“;“垫块损坏”;例外,java,android,exception,encryption,aes,Java,Android,Exception,Encryption,Aes,在此代码中,此行导致异常: clearText=c.doFinal(Base64.decode(encryptedText,Base64.DEFAULT)) javax.crypto.BadPaddingException:填充块损坏 我从以下渠道获得代码: 有什么想法吗 private String decrypt (String encryptedText) { byte[] clearText = null; try { S
clearText=c.doFinal(Base64.decode(encryptedText,Base64.DEFAULT))代码>
javax.crypto.BadPaddingException:填充块损坏
我从以下渠道获得代码:
有什么想法吗
private String decrypt (String encryptedText) {
byte[] clearText = null;
try {
SecretKeySpec ks = new SecretKeySpec(getKey(), "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, ks);
clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
return new String(clearText, "UTF-8");
} catch (Exception e) {
return null;
}
}
详细信息:我也在android上加密它Java+android+Encryption+Exception通常只意味着一件事,有人再次使用SecureRandom
类作为密钥派生函数。当“SHA1PRNG”
的SecureRandom
实现与Sun在Java SE中的实现不同时,此操作将失败。特别是如果将种子添加到随机数生成器的状态,而不是将种子用作PRNG的起点
基本上,只需使用SecretKey aesKey=new SecretKeySpec(byte[]keyData,“AES”)
即可,或者-如果您以密码开始-尝试使用PBKDF2生成密钥。Java+Android+加密+异常通常只意味着一件事,有人再次使用SecureRandom
类作为密钥派生函数。当“SHA1PRNG”
的SecureRandom
实现与Sun在Java SE中的实现不同时,此操作将失败。特别是如果将种子添加到随机数生成器的状态,而不是将种子用作PRNG的起点
基本上,只需使用SecretKey aesKey=new SecretKeySpec(byte[]keyData,“AES”)
即可,或者-如果您以密码开始-尝试使用PBKDF2生成密钥。owlstead的建议很有帮助,但对于这种情况,在
安卓开发者注意:确保用户数据安全
我对代码做了一些修改,将来可能对其他人有所帮助。我完全删除了getkey方法
private static String seed;
/**
* Encrypts the text.
* @param clearText The text you want to encrypt
* @return Encrypted data if successful, or null if unsucessful
*/
protected String encrypt(String clearText) {
byte[] encryptedText = null;
try {
byte[] keyData = seed.getBytes();
SecretKey ks = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, ks);
encryptedText = c.doFinal(clearText.getBytes("UTF-8"));
return Base64.encodeToString(encryptedText, Base64.DEFAULT);
} catch (Exception e) {
return null;
}
}
/**
* Decrypts the text
* @param encryptedText The text you want to encrypt
* @return Decrypted data if successful, or null if unsucessful
*/
protected String decrypt (String encryptedText) {
byte[] clearText = null;
try {
byte[] keyData = seed.getBytes();
SecretKey ks = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, ks);
clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
return new String(clearText, "UTF-8");
} catch (Exception e) {
return null;
}
}
owlstead的建议很有帮助,但对于这种情况,在
安卓开发者注意:确保用户数据安全
我对代码做了一些修改,将来可能对其他人有所帮助。我完全删除了getkey方法
private static String seed;
/**
* Encrypts the text.
* @param clearText The text you want to encrypt
* @return Encrypted data if successful, or null if unsucessful
*/
protected String encrypt(String clearText) {
byte[] encryptedText = null;
try {
byte[] keyData = seed.getBytes();
SecretKey ks = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, ks);
encryptedText = c.doFinal(clearText.getBytes("UTF-8"));
return Base64.encodeToString(encryptedText, Base64.DEFAULT);
} catch (Exception e) {
return null;
}
}
/**
* Decrypts the text
* @param encryptedText The text you want to encrypt
* @return Decrypted data if successful, or null if unsucessful
*/
protected String decrypt (String encryptedText) {
byte[] clearText = null;
try {
byte[] keyData = seed.getBytes();
SecretKey ks = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, ks);
clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
return new String(clearText, "UTF-8");
} catch (Exception e) {
return null;
}
}
我从中了解到:
将“AES/ECB/PKCS7Padding”更改为“AES” 我引用了以下内容:
将“AES/ECB/PKCS7Padding”更改为“AES” 对我来说,问题在于getKey()
确保两次调用getKey()
返回相同的值
我使用newsecurerandom(password.getBytes())
生成密钥。它在Windows上工作,但在Android上,它为不同的调用返回不同的值。对我来说,问题在于getKey()
确保两次调用getKey()
返回相同的值
我使用newsecurerandom(password.getBytes())
生成密钥。它在Windows上工作,但在Android上,它为不同的调用返回不同的值。链接中所述的方式不是更安全吗?如果这个家伙花时间制作一个指南,它可能在他的机器上工作,但为什么我的机器不行呢;SecretKey ks=新的SecretKeySpec(keyData,“AES”);我试过这个,效果很好。Butt,因为现在它不会自动转换为128-192-256位,所以我必须手动输入,我想我需要添加一个自动转换的方法,有什么建议吗?@Esq没有标准化的方法通过添加零值来创建更小或更大的密钥,因为这显然会降低密钥提供的安全性。因此,要做到这一点,需要使用一个KDF,如果您现在拥有的关键数据中有足够的熵,那么它可能是一个KBKDF。如果数据少于16字节(对于AES-128),则应使用PBKDF加强密钥。PBKDF2方法已经由Java实现。KBKDF不存在,但它们相对容易从HMAC构建,例如,您可以使用HKDF。或者,您可以使用简单的KDF,如KDF1。基本上,您将一个设置为零的四个字节附加到密钥种子,然后将一个OtherInfo
结构附加到该种子上(例如,“ENC”
或“MAC”
的ASCII表示)。最后,您可以使用任何加密安全散列(例如SHA-256)对其进行散列。然后使用最左边的字节作为KDF的输出。哦,我已经将缺少的KDF添加到Bouncy Castle。或者使用迭代计数为1的PBKDF2作为KBKDF。按照链接中所述的方式,它不是更安全吗?如果这个家伙花时间制作一个指南,它可能在他的机器上工作,但为什么我的机器不行呢;SecretKey ks=新的SecretKeySpec(keyData,“AES”);我试过这个,效果很好。Butt,因为现在它不会自动转换为128-192-256位,所以我必须手动输入,我想我需要添加一个自动转换的方法,有什么建议吗?@Esq没有标准化的方法通过添加零值来创建更小或更大的密钥,因为这显然会降低密钥提供的安全性。因此,要做到这一点,需要使用一个KDF,如果您现在拥有的关键数据中有足够的熵,那么它可能是一个KBKDF。如果数据少于16字节(对于AES-128),则应使用PBKDF加强密钥。PBKDF2方法已经由Java实现。KBKDF不存在,但它们相对容易从HMAC构建,例如,您可以使用HKDF。或者,您可以使用简单的KDF,如KDF1。基本上,您将一个设置为零的四个字节附加到密钥种子,然后将一个OtherInfo
结构附加到该种子上(例如,“ENC”
或“MAC”
的ASCII表示)。最后,您可以使用任何加密安全散列(例如SHA-256)对其进行散列。然后使用最左边的字节作为KDF的输出。哦,我已经将缺少的KDF添加到Bouncy Castle。或者使用PBK