- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 javax.crypto.cipher 来加密和解密一些数据。它运作良好。但有时,解密失败并出现 badPaddingException。如果我将成功的调用与失败的调用进行比较,则提供给密码的输入是相同的,并且密码的初始化方式相同。
我如何实例化我的密码
dcipher = Cipher.getInstance("PBEWithMD5AndDES");
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
我是这样用的
dec = Base64.decode(str) ;
byte[] utf8 = dcipher.doFinal(dec);
在 doFinal 上引发异常。
有什么想法吗?
谢谢!
哦,顺便说一句,我使用 bouncyCaSTLe 作为提供者,并使用
将其添加到列表顶部Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
为了完整起见,也因为问题时不时出现。这是完整的类(class)。
public class EncryptDecryptUtil {
/** Encryption Cipher */
private static Cipher ecipher;
/** Decription Cipher */
private static Cipher dcipher;
private static Logger logger = Logger.getLogger(EncryptDecryptUtil.class);
/**
* Constructor used to create this object. Responsible for setting and initializing this object's encrypter and
* decrypter Cipher instances given a Secret Key and algorithm.
*
* @param key Secret Key used to initialize both the encrypter and decrypter instances.
* @param algorithm Which algorithm to use for creating the encrypter and decrypter instances.
*/
public EncryptDecryptUtil(SecretKey key, String algorithm) {
Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
try {
ecipher = Cipher.getInstance(algorithm);
dcipher = Cipher.getInstance(algorithm);
ecipher.init(Cipher.ENCRYPT_MODE, key);
dcipher.init(Cipher.DECRYPT_MODE, key);
} catch (NoSuchPaddingException e) {
System.out.println("EXCEPTION: NoSuchPaddingException");
} catch (NoSuchAlgorithmException e) {
System.out.println("EXCEPTION: NoSuchAlgorithmException");
} catch (InvalidKeyException e) {
System.out.println("EXCEPTION: InvalidKeyException");
}
}
/**
* Constructor used to create this object. Responsible for setting and initializing this object's encrypter and
* decrypter Chipher instances given a Pass Phrase and algorithm.
*
* @param passPhrase Pass Phrase used to initialize both the encrypter and decrypter instances.
*/
public EncryptDecryptUtil(String passPhrase) {
Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
// 8-bytes Salt
byte[] salt = { (byte) 0xB9, (byte) 0x8B, (byte) 0xD8, (byte) 0x31, (byte) 0x55, (byte) 0x24, (byte) 0xF3, (byte) 0x13 };
// Iteration count
int iterationCount = 19;
try {
// Generate the secret key associated to the passphrase.
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
// Get instance of the cipher
ecipher = Cipher.getInstance("PBEWithMD5AndDES");
dcipher = Cipher.getInstance("PBEWithMD5AndDES");
// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
} catch (InvalidAlgorithmParameterException e) {
logger.error("during encrypter instantiation",e);
} catch (InvalidKeySpecException e) {
logger.error("during encrypter instantiation",e);
} catch (NoSuchPaddingException e) {
logger.error("during encrypter instantiation",e);
} catch (NoSuchAlgorithmException e) {
logger.error("during encrypter instantiation",e);
} catch (InvalidKeyException e) {
logger.error("during encrypter instantiation",e);
}
}
/**
* Takes a single String as an argument and returns an Encrypted version of that String.
*
* @param str String to be encrypted
* @return <code>String</code> Encrypted version of the provided String
*/
public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");
// Encrypt
byte[] enc = ecipher.doFinal(utf8);
// Encode bytes to base64 to get a string
return new String( Base64.encode(enc), "UTF8");
} catch (BadPaddingException e) {
logger.error("during encryption : ",e);
} catch (IllegalBlockSizeException e) {
logger.error("during encryption : ",e);
} catch (UnsupportedEncodingException e) {
logger.error("during encryption : ",e);
}
return new String();
}
/**
* Takes a encrypted String as an argument, decrypts and returns the decrypted String.
*
* @param str Encrypted String to be decrypted
* @return <code>String</code> Decrypted version of the provided String
*/
public String decrypt(String str) {
byte[] dec = new byte[0];
try {
// Decode base64 to get bytes. Not sure to understand why.
dec = Base64.decode(str) ;
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (BadPaddingException e) {
logger.error("error during decryption. String to decode was : "+str + " byte array to decode was : "+ Arrays.toString(dec) ,e);
} catch (IllegalBlockSizeException e) {
logger.error("during decryption : ",e);
} catch (UnsupportedEncodingException e) {
logger.error("during decryption : ",e);
}
return new String();
}
}
编辑:我想强调这两点:
...
for( int i = 0 ; i<1000000000 ; i++){
EncryptDecryptUtil encryptDecript = new EncryptDecryptUtil("pass");
if ( !"YES".equals(encryptDecript.decrypt("Q3qWLKo6yJY="))){
System.out.println("Fail at call " + i);
throw new InvalidParameterException() ;
}
}
所以也许它可能来 self 使用 EncryptDecryptUtils 类的方式?这是一个 Spring bean 的字段,实例化了一次。
com.myStuff.dlm.cryptography.EncryptDecryptUtil error during decryption. String to decode was : Q3qWLKo6yJY= byte array to decode was : [114, 52, -52, -54, 82, 87, 124, 84]
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_ab.b(DashoA13*..)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at com.dvidea.dlm.cryptography.EncryptDecryptUtil.decrypt(EncryptDecryptUtil.java:166)
最佳答案
只是一个想法:也许您正在跳跃不同的供应商(Sun/BC/等)
问候。
关于java - badPaddingException 在 doFinal 的某些调用上。不是全部。相同的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4895773/
我正在开发一个 Android 应用程序,我正在为其使用 Android 密码类解密一个大文件。 代码: private byte[] decrypt_chunk(byte[] data, ByteS
我正在尝试在 Android 中加密图像。我将图像转换为字节数组。后来想用密文制作一个全新的位图保存。以下代码用于我的加密 private static final String CIPHER_ALG
我正在使用 Java Cipher 和 AES 实现加密/解密。除了在调用 doFinal() 时多写了 5 个字节外,一切都运行良好。因此,我最终得到了一个正确解码的字符串,并附加了 5 个额外的字
这是我的完整代码: import static java.nio.file.StandardOpenOption.READ; import static java.nio.file.StandardO
问题可能很长,但我会尽量详细描述。 这是一个demo有像我这样的问题。 我有一个 android 应用程序,我想添加一个功能,允许用户在 SharedPreferences 中加密和保存他们的密码,并
有人知道 RxJava 2 中运算符“doAfterTerminate”和“doFinally”之间的区别吗? 最佳答案 不同之处在于,如果下游除了常规的 onError 或 取消/处置序列外,doF
我在 Java Card 上使用 DES 加密时遇到问题:我在发送数据之前加密数据,然后将其作为对来自某个库的请求的响应发送。 如果在一个小程序中 SELECT 发送信息请求,则通过卡上的 28-30
我有一些解密代码期望 Cipher.doFinal() 在使用不正确的 key /iv 时抛出异常。这似乎没有发生。好吧,它确实发生了,但并非总是如此。 我的加密使用当前时间的“秒”作为 Random
在java中,我们需要为太多的文本数据生成HmacSHA1/256消息摘要,当然还要并行。 现在的问题是,javax.crypto.Mac#doFinal(byte[]:arg) 是线程安全的,还是通
我正在尝试加密来自 glide 的输入流。 我将输入流转换为一个字节数组,并将其传递到我的加密方法中: fun encrypt(input: ByteArray): ByteArray { L
我遇到了一个问题,我的可观察对象在 IO 线程上订阅并在 android 主 (UI) 线程上观察,但 doFinally 运算符在 IO 线程上运行,它需要在 UI 线程上运行。 用例几乎和这个me
我正在尝试使用 RSA 算法加密和解密字符串。这里的加密工作正常,但问题出在解密上。 代码在到达 DECRYPT 方法中的 doFinal 时终止。我是输入错误还是公钥和私钥有问题?请给我一些建议。谢
我有一个使用 AES/CBC/PKCS5Padding 处于加密模式的 Cipher aesEncryptCipher。 为什么以下两个函数返回两个不同的东西? encrypt2的返回值是什么意思?根
我正在尝试创建一个程序,使用javax.crypto.Cipher API 检查数字签名。 只要 RSA key 正确配对,我的程序就可以正常工作。但是,当我尝试解密消息时使用不正确的 key 时,会
要求: 使用 AES 加密(使用 GCMParameterSpec 和 nonce)加密字符串。 将随机数附加到加密字符串以便稍后使用它进行解密。 通过提取随机数和要解密的字符串来解密字符串。 我已经
我想用 Java 进行 AES CBC 加密。我正在使用 javax.crypto。初始化 Cipher 后,我是否只需要对明文字节调用 doFinal 即可对其进行正确加密?或者我需要对更新做一些事
我正在研究加密和解密。我对密码学非常陌生,在使用充气城堡时遇到垫 block 损坏异常 这是我的加密/解密代码。 私有(private)AESFastEngine引擎; private Buffere
我有以下代码: KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey mSecretKe
在我的项目中,我异或(抱歉,但不知道正确的动词)字符串并使用 RSA-1024 加密。现在我有了一个xored 和加密 字符串,例如: 994624f87a00f4c3066c2a2d38917fe4
我如何创建一个单元测试,以在 rxjava 链的 doOnScubscribe 和 doFinally 上完成某种副作用? 例如: Observable.requestSomeValueFromWeb
我是一名优秀的程序员,十分优秀!