【问题标题】:MD5 Binary String conversion to Byte ArrayMD5 二进制字符串转换为字节数组
【发布时间】:2017-03-17 22:54:40
【问题描述】:

我想计算一个简单的程序,它会在其中执行 MD5,以散列我输入的二进制值。

我试过谷歌,所有所说的程序都是散列字符串。 那不是我要找的。我想对二进制进行哈希处理,结果将以十六进制形式提供给我。

下面是我尝试过的代码,但是, return 语句 return hash 有一个错误,它指出 byte[] 不能转换为字符串。

有人可以帮我解决这个问题吗?您的帮助将不胜感激。 我是编程密码算法的新手。

import java.security.*;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class JavaApplication1 {

    public static String getMD5(byte[] plaintext) throws Exception{

        //init hash algorithm
        MessageDigest md = MessageDigest.getInstance("MD5");

        //compute hash
        byte[] hash = md.digest(plaintext);


        //display hash in hex
        System.out.println(tohex(hash));
        return hash;

    }

    public static void main(String[] args) throws NoSuchAlgorithmException {
        System.out.println(getMD5(0111001101101000011001)); 
    }

    public static String tohex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();

        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(0xFF & bytes[i]);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }

        return hexString.toString();
    }
}

【问题讨论】:

  • 由于0111001101101000011001 在Java 中没有任何合法性,您真正希望它是什么?以二进制编码的整数?还有什么?
  • 二进制 > 哈希 > 十六进制
  • 是的,但是二进制什么?您的示例中的 0 和 1 是否代表单个位(意味着给出的是 22 位数字)?
  • @fvu 我发布的二进制值只是二进制值的一个例子

标签: java hash


【解决方案1】:

我在您的实施中发现了一些问题,例如:

  • 无法以这种方式将字节字符串传递给getMD5 函数。
  • getMD5 返回一个 String 但您正试图返回一个字节数组。如果您希望结果为十六进制字符串,您应该将return hash 更改为return tohex(hash);
  • getMD5 声明 throws Exception 错误且过于笼统,应声明 throws NoSuchAlgorithmException

我建议用这种方式将二进制字符串转换成字节数组:

String b = "0111001101101000011001";
byte[] bval = new BigInteger(b, 2).toByteArray();
System.out.println(getMD5(bval));

这是一个较短的版本:

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class JavaApplication1 {

    public static void main(String[] args) throws NoSuchAlgorithmException  {
      String b = "0111001101101000011001";

      byte[] bval = new BigInteger(b, 2).toByteArray();

      MessageDigest md = MessageDigest.getInstance("MD5");
      byte[] hash = md.digest(bval);

      for (byte b1 : hash) {
        System.out.print(String.format("%02X", b1));
      }
    }
}

【讨论】:

  • 有例子吗?返回哈希也有错误。抱歉,我是此类程序的新手
  • 因此,这个程序正在对我输入的二进制值和十六进制的结果进行哈希处理,对吗?
  • @moon 把getMD5函数的返回值改成return tohex(hash);
  • 类型不兼容,字符串不能转字节。
  • @moon 你的问题不清楚。可能这是在 SO 上提出新问题的机会吗? :) 顺便说一句,你能删除所有不必要的 cmets 吗?
猜你喜欢
  • 2013-07-17
  • 1970-01-01
  • 2011-01-27
  • 2011-03-27
  • 2015-12-16
  • 2019-06-22
  • 2021-12-20
  • 2019-03-14
相关资源
最近更新 更多