Возникли проблемы с имитацией вывода Java MessageDigest в C# - PullRequest
2 голосов
/ 06 марта 2020

У меня есть программа java (сторонняя, поэтому не может редактировать), которая генерирует строку в кодировке Base64 из MD5 га sh. В данном случае он не используется из соображений безопасности, более того, чтобы получить уникальное значение для строки, предоставленной для последующего простого сравнения.

Я пытаюсь сгенерировать ту же строку Base64 в моем приложении C#, поэтому Я также могу использовать его для сравнения позже.

Вот код, а затем я go попробую.

Соответствующие части программы Java (извлечено из декомпилятор IntelliJ):

String encodedValue = 
encode("Lot#: 9999  ExpDate: Mar 6, 2020  Date: Apr 1, 2020  QtyD: 0.56  Chk: True  Int: 120  Mon: $90.00");


public static String encode(String password) throws IOException, NoSuchAlgorithmException, MessagingException {

ByteArrayOutputStream out = new ByteArrayOutputStream();

try {
    OutputStream encoder = MimeUtility.encode(out, "base64");
    try {
        byte[] encrypted = encrypt(password);
        encoder.write(encrypted);
        encoder.flush();
        return new String(out.toByteArray());
    catch(...) {}
catch(...){}
}


private static byte[] encrypt(String password) throws NoSuchAlgorithmException {
    MessageDigest algorithm = MessageDigest.getInstance("MD5");
    algorithm.reset();
    algorithm.update(password.getBytes());
    return algorithm.digest();
}

C# section

string input = 
"Lot#: 9999  ExpDate: Mar 6, 2020  Date: Apr 1, 2020  QtyD: 0.56  Chk: True  Int: 120  Mon: $90.00";

using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
    byte[] inputBytes = Encoding.GetEncoding(28591).GetBytes(input); //matches Java so far
    byte[] hashBytes = md5.ComputeHash(inputBytes);
    string base64 = Convert.ToBase64String(hashBytes);
}

Если я запускаю оба входных байта [] (password.getBytes () и Encoding.GetEncoding (28591) .GetBytes (вход) через кодировщик Base 64, они оба возвращают одно и то же значение.

TG90IzogOTk5OSAgRXhwRGF0ZTogTWFyIDYsIDIwMjAgIERhdGU6IEFwciAxLCAyMDIwICBRdHlEOiAwLjU2ICBDaGs6IFRydWUgIEludDogMTIwICBNb246ICQ5MC4wMA==

Это заставляет меня полагать, что кодировка между ними верна.

Если я проверяю зашифрованный байт [], значения не совпадают

Java байт [] значение

C# байт [] значение

На основании , и , , я понял, что Java использует числа со знаком, так что у выходных данных на отладчике действительно не будет совпадать, но фактические значения все еще должны.

Я пытался использовать

for (byte b : bytes) {
    System.out.println(b & 0xFF);
}

, чтобы просмотреть подписанный аналог в c#, C# подписанный массив , но массивы по-прежнему не совпадают.

И для окончательного вывода, строки, закодированные в base64

Java
0mfvZiQ7tDOnMsP/qH8CLQ==

C#
W2afrKbW3jHPMv7HHnc8nw==

Я не уверен, что MessageDigest делает что-то дополнительное в шифровании, которое я не вижу, чтобы реплицировать, или если я что-то упустил полностью.

Я могу отладить обе стороны, поэтому, если какая-либо дополнительная информация будет полезна, дайте мне знать.

Любая помощь будет принята с благодарностью!

...