У меня есть программа 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 делает что-то дополнительное в шифровании, которое я не вижу, чтобы реплицировать, или если я что-то упустил полностью.
Я могу отладить обе стороны, поэтому, если какая-либо дополнительная информация будет полезна, дайте мне знать.
Любая помощь будет принята с благодарностью!