Строка в байтовый массив, а затем в MD5 в Java - PullRequest
2 голосов
/ 28 октября 2011

за последние 5 часов я пытаюсь сделать что-то, что должно быть очень простым и сделало это за 10 минут в C #, но с Java это не повезло.Я получил 32 UpperCase и Numeric String (A-Z0-9), мне нужно конвертировать эту строку в Dec, а затем md5.Моя проблема в том, что у меня нет незастроенных байтов, поэтому я не могу md5 мой массив: \

Вот что мне нужно сделать в Python:

salt = words[1].decode("hex")
passwordHash = generatePasswordHash(salt, pw)
generatePasswordHash(salt, password):
    m = md5.new()
    m.update(salt)
    m.update(password)
    return m.digest()

и здесь это в C #:

public static string GeneratePasswordHash(byte[] a_bSalt, string strData) {
    MD5 md5Hasher = MD5.Create();

    byte[] a_bCombined = new byte[a_bSalt.Length + strData.Length];
    a_bSalt.CopyTo(a_bCombined, 0);
    Encoding.Default.GetBytes(strData).CopyTo(a_bCombined, a_bSalt.Length);

    byte[] a_bHash = md5Hasher.ComputeHash(a_bCombined);

    StringBuilder sbStringifyHash = new StringBuilder();
    for (int i = 0; i < a_bHash.Length; i++) {
        sbStringifyHash.Append(a_bHash[i].ToString("X2"));
    }

    return sbStringifyHash.ToString();
}

protected byte[] HashToByteArray(string strHexString) {
    byte[] a_bReturn = new byte[strHexString.Length / 2];

    for (int i = 0; i < a_bReturn.Length; i++) {
        a_bReturn[i] = Convert.ToByte(strHexString.Substring(i * 2, 2), 16);
    }

    return a_bReturn;
}

Я буду очень рад получить помощь в этом:)

Ответы [ 3 ]

8 голосов
/ 28 октября 2011

Чтобы разобрать шестнадцатеричную строку в байт: (byte) Integer.parseInt(s, 16).

Чтобы преобразовать строку пароля в байтовый массив, используя кодировку по умолчанию (что я советую не делать: всегда указывайте определенную кодировку): password.getBytes() (или password.getBytes(encoding) для конкретной кодировки).

Чтобы хэшировать байтовый массив: MessageDigest.getInstance("MD5").digest(byte[]).

Чтобы преобразовать байт в шестнадцатеричную строку: См. В Java, как я могу преобразовать байтовый массив в строку шестнадцатеричных цифр, сохраняя ведущие нули?

2 голосов
/ 28 октября 2011

Я считаю, что будет работать что-то вроде следующего:

// convert your hex string to bytes
BigInteger bigInt = new BigInteger(salt, 16);
byte[] bytes = bigInt.toByteArray();
// get the MD5 digest library
MessageDigest md5Digest = null;
try {
    md5Digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
    // error handling here...
}
// by default big integer outputs a 0 sign byte if the first bit is set
if (bigInt.testBit(0)) {
    md5Digest.update(bytes, 1, bytes.length - 1);
} else {
    md5Digest.update(bytes);
}
// get the digest bytes
byte[] digestBytes = md5Digest.digest();

Вот еще несколько идей для преобразования шестнадцатеричной строки в массив byte[]:

0 голосов
/ 28 октября 2011

Вы можете использовать числа без знака в Java с применением битовых масок. Подробнее смотрите здесь .

...