gpt4 book ai didi

java - 如何计算 AES-128-CBC 的 key 校验值?

转载 作者:行者123 更新时间:2023-12-05 03:31:18 26 4
gpt4 key购买 nike

我正在尝试用 Java 实现一个函数来计算 128 位 AES 加密 key 的 key 校验值。 AES128CBCEncryptor 类使用 ISO 9797-1 M2 填充实现 AES/128/CBC。

我能找到的关于 AES key 校验值算法的唯一信息是“AES key 的 KCV 是通过加密 16 个字节计算的,每个字节的值为‘01’”。它没有指定应该如何构建 IV。

到目前为止,这是我所拥有的,但它没有产生预期的结果:

    public String computeAesCheckValue(String key) throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException,
NoSuchAlgorithmException, NoSuchPaddingException, IOException {
AES128CBCEncryptor encryptor = new AES128CBCEncryptor(key);

byte[] cleartext = new byte[16];
byte[] iv = new byte[16];
for (int i = 0; i < 16; i++) {
cleartext[i] = (byte) 0x01;
iv[i] = (byte) 0x00;
}
String kcv = encryptor.encrypt(new String(cleartext, "utf-8"), Hex.encodeHexString(iv));

return (kcv != null && kcv.length() >= 6)
? Hex.encodeHexString(kcv.getBytes()).substring(0, 6)
: null;
}

我错过了什么?

最佳答案

对于 key 校验值 (KCV),通常使用单 block 加密,没有任何模式,例如 ECB 或 CBC。由于仅使用 16 字节的常量值,因此也不需要填充。

如果您只有一个执行 ISO 9797-1 M2 填充的 CBC 类,那么您可以使用 全零加密 01010101010101010101010101010101 的静态值(16 字节的十六进制编码) IV 并从结果中取出前 16 个字节(在末尾删除 16 个字节的密文,这只是强制填充的加密)。

如下图所示,由于 IV 全为零,与明文的 XOR 使输入保持不变,基本上使第一个密文与使用分组密码的直接加密相同。

enter image description here作者:WhiteTimberwolf(SVG 版)- PNG 版,公共(public)领域,https://commons.wikimedia.org/w/index.php?curid=26434096

但是,当您使用 Java 时,使用 Cipher 对象使用算法 "AES/ECB/NoPadding" 并使用它来加密值更有意义01010101010101010101010101010101 直接。 ECB 不采用 IV,因此可以避免该问题。此外,指定 "NoPadding" 时无需考虑填充。

如果您需要更少的字节:这些字节通常取自结果的左侧(最低索引)。


请注意,这些类型的 KCV 有点危险,因为它们显示了一个特定明文 block 的密文。在最坏的情况下,这可能导致对手解密一个密文 block ,或者导致经过身份验证的方案失去其完整性/身份验证属性。

通常 KCV 在全零明文 block 上。使用全单值 block 可以降低发生这种情况的可能性,但这种可能性仍然很大。

关于java - 如何计算 AES-128-CBC 的 key 校验值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70683993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com