【问题标题】:java MD5 encryption minus value in byte arrayjava MD5加密减去字节数组中的值
【发布时间】:2015-05-11 07:02:39
【问题描述】:

您好,我正在使用下面的代码来加密字符串。 我发现 MD5 在 -127 - +128 值下工作。

我得到了减去的价值。

public static void main(String[] args) throws Exception {
        String message = "smile";

        encrypt("Jack the Bear");
    }

    public static void encrypt(String password) throws Exception {

      byte byteData[] =null;

     MessageDigest md = null;
       try {
         md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes("US-ASCII"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      byteData = md.digest();
      System.out.println(Arrays.toString(byteData));


    }

我的输出:[101、23、66、106、91、-51、6、119、-13、23、-101、108、-122、27、20、-124]

实际输出:[101, 23, 66, 106, 91, 205, 6, 119, 243, 23, 155, 108, 134, 27, 20, 132]

【问题讨论】:

  • 所有 Java 字节已签名。它与 MD5 具体无关。

标签: java encryption bytearray md5 message-digest


【解决方案1】:

这是因为 Java 中的 byte 类型(与几乎所有其他类型一样)已签名,这意味着它的范围为 -128..127

如果您想将此范围转换为无符号范围 (0..255),请执行以下操作:

byte b = -2;
int i = b & 0xff;

像这样打印您的结果byteData

for (byte b : byteData)
    System.out.print((b & 0xff) + " ");

如果要以十六进制格式打印结果:

for (byte b : byteData)
    System.out.printf("%02x ", b);

【讨论】:

  • 宁可使用十六进制而不是十进制。无论如何,你永远不会看到十进制格式的哈希。
  • @Kayaman 同意,但提问者有十进制的“真实”输出,这就是为什么我建议这样做以达到预期结果。
  • 是的,我只是将评论放在这里以供参考。
  • 此输出数组用于 C# 输出
【解决方案2】:

您的摘要计算正确,负字节值没有任何问题。

Java 中的字节类型范围从 -128 到 +127,这可能有点令人惊讶 - 许多人认为字节是无符号的,但 Java 没有无符号数字类型。

【讨论】:

  • 差不多。 Java 唯一的无符号类型是 char(我知道,这并不重要,因为您不会使用 char 进行任何计算)。
  • @Kayman 好吧,我不认为 char 是数字类型(盒子类型 Character 毕竟没有实现 java.lang.Number),即使它具有序数值。
  • 没错,您确实指定了“无符号 number 类型”。好吧,语义语义。
猜你喜欢
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多