【发布时间】:2019-03-23 00:59:09
【问题描述】:
我有这个 20 字节的十六进制数组,它是 SAH-1 的输出 [摘要]:
b1d5781111d84f7b3fe45a0852e59758cd7a87e5
如何将它作为 16 字节重用为 AES_CBC 加密算法中的初始化 IV,如下所示:
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
Utils 类:
public class Utils
{
private static String digits = "0123456789abcdef";
public static String toHex(byte[] data, int length)
{
StringBuffer buf = new StringBuffer();
for (int i = 0; i != length; i++)
{
int v = data[i] & 0xff;
buf.append(digits.charAt(v >> 4));
buf.append(digits.charAt(v & 0xf));
}
return buf.toString();
}
public static String toHex(byte[] data)
{
return toHex(data, data.length);
}
public static byte[] toByteArray(
String string)
{
byte[] bytes = new byte[string.length()];
char[] chars = string.toCharArray();
for (int i = 0; i != chars.length; i++)
{
bytes[i] = (byte)chars[i];
}
return bytes;
} }
【问题讨论】:
-
如果您使用的是 JCA 加密(即
javax.crypto.Cipher类),IV 应该是二进制而不是十六进制(尽管您可能会以十六进制发送或显示它),如果你有一个 20 字节(二进制)的 SHA1,你不需要调整它的大小,你可以在构造IvParameterSpec时只选择前 16 个字节(或最后一个或中间);请参阅 javadoc。 ... -
... 但是,如果您正在散列对手已知(或提供)的“输入”,这会使您的 IV 对对手具有可预测性,并且 CBC 的可预测 IV 允许攻击,这可能会使您的系统不安全;这不是 SO 的编程 Q 和题外话,而是题外话,并且在 cryptography.SX 和 security.SX 上有许多现有 Q。