Как использовать .NET TripleDESCryptoServiceProvider в Android Studio (Котлин)?

#java #c# #android #kotlin #encryption

Вопрос:

У меня есть этот код, который я использую в своем приложении на C# (рабочий стол Windows); тем не менее, я хочу перенести свое приложение на Android, но я не знаю способа, который дает те же результаты шифрования/дешифрования в Kotlin или Java. До сих пор я пробовал несколько решений, но ни одно из них не работало для меня (так как они не дают идентичных результатов для моего приложения на C#).:

Я попробовал это решение (но оно не дало того же результата шифрования): https://www.programmersought.com/article/74841385394/

И это тоже: https://androidfreetutorial.wordpress.com/2017/03/14/android-encryptiondecryption-with-tripledes-3des-algorithm/

Я хочу, чтобы как мое приложение для рабочего стола Windows (C#), так и мои варианты приложений для Android (Kotlin) давали одинаковые результаты шифрования или дешифрования.

Мой код на C# :

 private static string key = "123456789";

private static TripleDESCryptoServiceProvider CryptoServiceProvider()
{
    TripleDESCryptoServiceProvider myCryptoService = new TripleDESCryptoServiceProvider();
    MD5CryptoServiceProvider myMD5_Service = new MD5CryptoServiceProvider();
    myCryptoService.Key = myMD5_Service.ComputeHash(Encoding.Unicode.GetBytes(key));
    myCryptoService.Mode = CipherMode.ECB;
    return myCryptoService;
}

private static string Encrypt(string message)
{
    ICryptoTransform myEncryptor = CryptoServiceProvider().CreateEncryptor();
    byte[] bytes = Encoding.Unicode.GetBytes(message);
    return Convert.ToBase64String(myEncryptor.TransformFinalBlock(bytes, 0, bytes.Length));
}

private static string Decrypt(string message)
{
    ICryptoTransform myEncryptor = CryptoServiceProvider().CreateDecryptor();
    byte[] messageBytes = Convert.FromBase64String(message);
    byte[] _messageBytes = myEncryptor.TransformFinalBlock(messageBytes, 0, messageBytes.Length);
    return Encoding.Unicode.GetString(_messageBytes, 0, _messageBytes.Length);
}
 

Зашифровать(«Мое сообщение») => bRhsN5v76jrQcl54VrTKIAtsTAK0Hq3B

Расшифровать(«bRhsN5v76jrQcl54VrTKIAtsTAK0Hq3B») => Мое сообщение

Итак, простыми словами, мне нужен способ перенести логику этого кода в Kotlin (или Java, если необходимо).

Примечание 1: Я не могу изменить методы шифрования/дешифрования, используемые в моем приложении на C#, потому что это все испортило бы для меня… Поэтому Я НЕ МОГУ НИ использовать какой-либо другой криптографический алгоритм, НИ модифицировать существующие методы.

Примечание 2: Я был бы очень признателен, если бы было найдено решение, использующее Kotlin вместо Java.

Комментарии:

1. Пожалуйста, посмотрите programmersought.com/article/74841385394

2. Это просто шифрование с тройным DES в варианте с двумя ключами с использованием MD5 для вывода ключа. Единственная ловушка, которую я вижу,-это кодировка, используемая для открытого текста и ключа: MS указывает кодировку UTF-16LE (little andian) Unicode . Пожалуйста, опубликуйте свой последний код Kotlin/Java и опишите проблему.

3. Обратите внимание, что код C# является многократно небезопасным (сломанный MD5, получение ключа из пароля с дайджестом, ECB) и неэффективным (тройной DES).