【问题标题】:What is the purpose to add padding to hex?向十六进制添加填充的目的是什么?
【发布时间】:2014-10-31 01:44:38
【问题描述】:

您好,我阅读了this post,了解如何对密码实施加盐和散列,但我被困在上面指定的网站下的指定代码上。

private static String toHex(byte[] array)
{
    BigInteger bi = new BigInteger(1, array);
    String hex = bi.toString(16);
    int paddingLength = (array.length * 2) - hex.length();
    if(paddingLength > 0)
        return String.format("%0" + paddingLength + "d", 0) + hex;
    else
        return hex;
}

我的问题是,如果结果 paddingLength 大于零,他们为什么要计算 paddingLength 并将其实现为十六进制?

【问题讨论】:

    标签: java encryption hex


    【解决方案1】:

    BigInteger(byte[]) 将字节数组解释为二进制补码值;这意味着它对于 N 长度的数组有 2^(8*N) 个可能的值(因为每个字节包含 8 位)。

    同时,长度为 M 的十六进制字符串有 16^M 个可能的值(因为每个字符编码 16 个值之一)。

    作者想要byte[]String 之间的一对一映射:给定一个字符串,您应该能够准确地确定它来自byte[]。为此,我们必须确保字符串可以编码与byte[] 一样多的值。代入上面的数字,我们得到:

    (# values for an N-length byte[]) == (# values for an M-length String)
    2^(8*N)                           == 16^M
    

    让我们用 N 来求解 M。第一步是重写右手边。如果你记得你的exponent power rules,a^(b*c) == (a^b)^c。让我们把右边的指数的底设为 2:

                                      == (2^4)^M
                                      == 2^(4*M)
    

    所以我们有 2^(8*N) == 2^(4*M)。如果 2^k == 2^j,这意味着 k == j。所以,8*N == 4*M。两边除以 4 得到 M = 2N。

    要将它们重新组合在一起,请记住 N 是字节数组的长度,M 是十六进制字符串的长度。我们刚刚发现,为了存在一对一映射,M = 2N——换句话说,十六进制字符串应该是字节数组的两倍。

    填充确保了这一点。

    【讨论】:

    • 那当然是正确答案,但是上面的toHex()方法不应该用。它速度慢、难以阅读、使用额外的内存、使用具有动态内容的格式字符串等。
    • 是的。我关注的是意图(将字节数组的长度加倍)而不是实现,因为这似乎是问题所在。
    【解决方案2】:

    因为他们希望数组中的所有字节都以十六进制字符串表示,即使它们前导零字节。

    不过,编写toHex 方法并不是最明显的方式。

    我发现这样的事情更清楚:

    private static String toHex(byte[] array) {
        StringBuilder s = new StringBuilder();
        for (byte b : array) {
            s.append(String.format("%02x", b));
        }
        return s.toString();
    }
    

    【讨论】:

    • 这也是我的方法(如果我不需要性能)。但是,我总是在字符串生成器的构造函数中指定 array.length * 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多