【问题标题】:How to resize array 20 byte to 16 byte in Java如何在 Java 中将数组 20 字节大小调整为 16 字节
【发布时间】: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。

标签: java arrays aes sha1 sha


【解决方案1】:

[编辑:更新代码以使用评论中请求的代码]

使用Arrays.copyOf(keyBytes, 16)

MessageDigest hash = MessageDigest.getInstance("SHA1"); 
hash.update(Utils.toByteArray(input)); 
byte[] keyBytes = hash.digest();
keyBytes = Arrays.copyOf(keyBytes, 16); // use only first 128 bit
System.out.println("digest : " + Utils.toHex(keyBytes));

【讨论】:

  • 这是我的代码:MessageDigest hash = MessageDigest.getInstance("SHA1"); hash.update(Utils.toByteArray(input)); System.out.println("摘要:" + Utils.toHex(hash.digest()));我该如何混合它们?
  • 我更新了我的回复以使用您的代码。你是这个意思吗?
  • 我得到了同样的结果! @Yoav 古尔
  • 这很奇怪。你能分享你的 Utils 课程吗?
  • 我上传了 Utils 类 @Yoav Gur
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多