- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用带有盐和 IV 的 AES 来加密和解密唯一 ID,但在解密时给出 javax.crypto.BadPaddingException 。
解密数据时每次给出的完整错误堆栈跟踪
javax.crypto.BadPaddingException: Given final block not properly padded null
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at com.data.commons.security.impl.DataAESCrypt.decode(DataAESCrypt.java:84)
at com.data.CryptoTest.main(CryptoTest.java:13)
加密方法 -
private static final int PASSWORD_ITERATIONS = 65536;
private static final int KEY_LENGTH = 256;
private static byte[] salt = new byte[16];
private static byte[] iv= new byte[16];
private static final String ALGORITHM = "AES/CBC/PKCS5Padding" ;
@Override
public String encode(String plainText) throws Exception {
// TODO Auto-generated method stub
try {
SecureRandom random = new SecureRandom();
random.nextBytes(salt);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(plainText.toCharArray(), salt, PASSWORD_ITERATIONS, KEY_LENGTH);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
AlgorithmParameters params = cipher.getParameters();
iv = params.getParameterSpec(IvParameterSpec.class).getIV();
cipher.init(Cipher.ENCRYPT_MODE, secret);
byte[] encryptedText = cipher.doFinal(plainText.getBytes("UTF-8"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(salt);
outputStream.write(iv);
outputStream.write(encryptedText);
System.out.println("Salt " + DatatypeConverter.printBase64Binary(salt) + " IV " + DatatypeConverter.printBase64Binary(iv) );
return DatatypeConverter.printBase64Binary(outputStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
解密方法
public String decode(String encodedText) throws Exception {
// TODO Auto-generated method stub
try {
byte[] ciphertext = DatatypeConverter.parseBase64Binary(encodedText);
if (ciphertext.length < 48) {
return null;
}
byte[] salt = Arrays.copyOfRange(ciphertext, 0, 16);
byte[] iv = Arrays.copyOfRange(ciphertext, 16, 32);
byte[] ct = Arrays.copyOfRange(ciphertext, 32, ciphertext.length);
System.out.println("Salt " + DatatypeConverter.printBase64Binary(salt) + " IV " + DatatypeConverter.printBase64Binary(iv) );
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(encodedText.toCharArray(), salt, PASSWORD_ITERATIONS, KEY_LENGTH);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
byte[] plaintext = cipher.doFinal(ct);
return new String(plaintext, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
我是 JCA 新手。
最佳答案
您正在使用 plainText.toCharArray()
和 encodedText.toCharArray()
作为 PBEKeySpec
中的密码。相反,请使用实际的密码。目前,只有在知道明文消息的情况下才能取回明文消息,这并不是很有用。用编码后的密文作为输入来解密肯定不行。
关于javax.crypto.BadPaddingException - 使用 Salt 和 IV 通过 AES256 进行解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525683/
题目地址:https://leetcode-cn.com/problems/course-schedule-iv/ 题目描述 你总共需要上 n 门课,课程编号依次为 0 到 n-1 。 有的课会
我即将使用以下脚本来加密和解密一些数据。我正在使用它,因为我当前的加密在我们的新服务器上不起作用。我们目前正在使用 mcrypt,所以我想更改为 openssl。 在我们的数据库中,我们使用 aes
有人可以告诉我为什么会收到此错误消息吗?显然这是我缺少的某种转换 预期 IV 长度为 16 但实际为 24 我用它来调用它 String encrypted = "E5ADDEB05D9D7B3925
这是我用来加密/解密数据的代码: // Set the method $method = 'AES-128-CBC'; // Set the encryption key $encryption_ke
1.题目 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
在 AES 中,我的理解是盐是使密码更安全的东西,它不会被添加到加密文本中。但是IV是用来加密第一个消息 block 的东西,将被添加到加密文本中。 我有什么问题吗? 最佳答案 AES 本身并不直接使
我需要编写一个简化的加密 API,它可以通过使用随机生成的 key 或密码派生的 key 轻松处理对称加密。 密码生成是使用 OpenSSL 库中的 PKCS5_PBKDF2_HMAC() 函数并使用
我正在 Java 中使用 AES/CTR/NoPadding 使用恒定 key 和随机 IV 来加密我的消息。 我计划将 IV 添加到密文前面,然后对其进行 Base64 编码。 现在有一个问题困扰着
如果在加密明文时使用随机IV,那么密文的接收者如何知道IV是什么以对其进行解密? 这是对上一个关于 IVs here. 的 stackoverflow 问题的回复的后续问题 The IV allows
我“到处”都找过了,但找不到。是否有示例说明如何使用 c++ Quantlib 来对具有合成行使价/到期日的期权价格进行插值? 例如,如果“今天”是 2017 年 2 月 6 日,我得到了 2017
当我尝试为 TripleDES 加密器创建 IV 初始化向量时出现以下错误。 请看代码示例: TripleDESCryptoServiceProvider tripDES = new TripleDE
我无法理解以下句子:“初始化向量 (IV) 中的数字全为零(不是 ASCII 字符‘0’)。 我的目标是使用 openssl enc 命令使用 aes-128-cbc 和 key K(比如 12345
我正在阅读有关如何对 key 加盐以确保加密安全的教程,但没能充分理解它。我对密码学了解不多,需要一些帮助。我正在使用 commoncrypto 来加密文件,并且已经完成,除了它不安全这一事实....
我正在尝试创建dBase文件,因为似乎我的Export vba代码中的.TransferDatabase()方法要求该文件存在(请继续获取“字段将不适合记录”。假设由于文件不存在)。 我在网上使用vb
是否建议我使用 initialization vector加密/解密我的数据?它会让事情变得更安全吗?这是需要根据具体情况进行评估的事情之一吗? 为了将其放入实际上下文中,Win32 加密函数 Cry
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我试图在加密后但写入之前将一个 16 字节安全生成的 IV 附加到每个文件上。这样我以后就可以通过从文件中拉出 IV 来解密它。这是我到目前为止的代码: public static void encr
了解 PKCS5_PBKDF2_HMAC()需要一个salt 并返回一个derivedKey 还有那个GCM::Encryption.SetKeyWithIV()需要 iv(以及 derivedKey
我是一名优秀的程序员,十分优秀!