首页 > 解决方案 > 是否可以从代码(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。

问题是,有没有办法从其他信息中获取这个参数:

标签: javaencryptioncrypt

解决方案


您正在使用 AES 加密,它使用秘密加密密钥和初始化向量 (IV) 来加密和解密消息。秘密加密密钥是您真正想要保密的单个值。另一方面,初始化向量应该随着每条加密消息而改变,其主要目的是使两个相同的消息加密为两个看起来完全不同的密文,从而防止攻击者能够识别重复的加密消息(即使内容仍然隐藏)。话虽如此,初始化向量并不是秘密,它通常被附加到密文(加密消息)中以供接收者获取。如果你很幸运,那么你拥有的密文的前 16 个字节是 IV,可能是用 BASE64 编码的:分隔器。如果您没有任何密文,那么您应该为 IV 选择任何随机值,确保接收方也获得 IV 以便能够解密消息。

PS:如果您有一条知道该消息是什么的加密消息,则可以暴力破解 16 字节 IV,但是在 10 亿台计算机上以每毫秒 1000 次尝试尝试这些 3.4e38 选项的预期时间仍然是 1e16年。当您使用安全算法时,破解它是不可行的。


推荐阅读