java - 是否可以从代码(JAVA)中检索 IvParameterSpec?
问题描述
我有一个代码:
byte[] var1 = e.getBytes("UTF-8");
SecretKeyFactory var2 = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec var3 = new PBEKeySpec("C9C34EA5E77EF9FF".toCharArray(), var1, 65536, 128);
SecretKey var4 = var2.generateSecret(var3);
SecretKeySpec var5 = new SecretKeySpec(var4.getEncoded(), "AES");
IvParameterSpec var6 = new IvParameterSpec(ivs);
Cipher var7 = Cipher.getInstance("AES/CBC/PKCS5Padding");
var7.init(1, var5, var6);
byte[] var8 = var7.doFinal(var0.getBytes("UTF-8"));
return var8;
并将此字节数组用于IvParameterSpec:
private static final byte[] ivs = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
我正在尝试重新构建这段代码,我已经有了这个函数的最终值和所有其他参数,但最终值与预期不符,因为我不知道的唯一参数是 IvParameterSpec。
问题是,有没有办法从其他信息中获取这个参数:
解决方案
您正在使用 AES 加密,它使用秘密加密密钥和初始化向量 (IV) 来加密和解密消息。秘密加密密钥是您真正想要保密的单个值。另一方面,初始化向量应该随着每条加密消息而改变,其主要目的是使两个相同的消息加密为两个看起来完全不同的密文,从而防止攻击者能够识别重复的加密消息(即使内容仍然隐藏)。话虽如此,初始化向量并不是秘密,它通常被附加到密文(加密消息)中以供接收者获取。如果你很幸运,那么你拥有的密文的前 16 个字节是 IV,可能是用 BASE64 编码的:
分隔器。如果您没有任何密文,那么您应该为 IV 选择任何随机值,确保接收方也获得 IV 以便能够解密消息。
PS:如果您有一条知道该消息是什么的加密消息,则可以暴力破解 16 字节 IV,但是在 10 亿台计算机上以每毫秒 1000 次尝试尝试这些 3.4e38 选项的预期时间仍然是 1e16年。当您使用安全算法时,破解它是不可行的。
推荐阅读
- python-3.x - pandads 数据帧比较
- android - 模拟器视图中的错误,但 android studio 视图是正确的
- javascript - 根据从下拉列表中选择的零件名称显示数量
- html - 如何使用 css 关键帧动画保持元素动画
- reactjs - 如果条件为真,则为属性添加价值
- jquery - 如何将elasticsearch与nodejs连接起来
- active-directory - ADU&C COM 扩展注册
- python - RuntimeError: 给定组=1,大小为 [64, 32, 3, 3] 的权重,预期输入 [128, 64, 32, 32] 有 32 个通道,但有 64 个通道
- android - 在具有客户端/服务器架构的 Android 中使用 Glide 时在何处以及如何存储图像
- nginx - 在配置为 nginx 服务器上方的反向代理的 tomcat 8.5.63 上使用 http2 启用 gzip 配置时遇到问题