java - Java - AES CBC 算法生成 SecretKeySpec 的不同方式
问题描述
我正在尝试实现AES CBC 256算法。在网上学习并检查了一些代码示例后,我意识到有两种不同的检索方式,SecretKeySpec
并且都会导致不同的加密消息。
private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
String salt = "a";
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded(), "AES");
}
// private static SecretKeySpec getSecretKeySpec(String secretKey) throws NoSuchAlgorithmException {
//
// MessageDigest digest = MessageDigest.getInstance("SHA-256");
// digest.update(secretKey.getBytes(StandardCharsets.UTF_8));
// byte[] keyBytes = new byte[32];
// System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
// return new SecretKeySpec(keyBytes, "AES");
// }
public static String encrypt(String strToEncrypt, String secret)
{
try
{
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeySpec secretKeySpec = getSecretKeySpec(secret);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
请有人告诉我哪一个是正确实现 AES CBC 256 位加密的方法?
解决方案
AES & CBC 没有指定任何关于如何派生密钥的内容。任何 128、192 和 256 位密钥均有效。使用像 PBKDF2WithHmacSHA256 这样的实际密钥派生函数比单次传递到 SHA-256 来减缓暴力攻击更可取,但除此之外,它们都会生成有效密钥。
推荐阅读
- node.js - POST 请求显示未定义
- haskell - 在haskell中实现程序for循环,跟踪多个变量
- python - tf.gradient 表现得像 tfp.math.diag_jacobian
- angular - Angular 6 效果在新操作中合并来自服务调用的有效负载和数据
- postgresql - 还原 SQL 转储时忽略丢失的列
- core-data - 在核心数据中维护复杂的单向关系
- php - Wordpress 简码适用于 WP 编辑器,但不适用于 PHP 文件
- c# - 通过 ASP.NET Core 中的表单进行 Ajax 请求
- javascript - Angular 6 - 表单 - 选择选项未正确更新
- elasticsearch - 如何在弹性搜索中按前缀搜索