Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
Здравствуйте.
Получаю от веб приложения зашифрованную строку вида "375443C1E58F3847"
Строка зашифрована алгоритмом triple DES с использованием библиотеки https://github.com/hosseinmd/data-crypto/blob/master/src/tripleDes.ts
Пытаюсь расшифровать полученное:
byte[] key = decodeHex(PIN_ENCRYPTED_KEY.toCharArray());
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "DESede"));
byte[] bytesStr = decodeHex(str.toCharArray());
byte[] decrypted = cipher.doFinal(bytesStr);
String retVal = new String(decrypted, StandardCharsets.UTF_8);


в retVal получаю что-то типа ��\r�)�

Ключ при шифровании/дешифровании совпадает.
С кодировками игрался, всякий раз получается какая-то чушь.
Подскажите, как правильно дешифровать полученную строку?
12 апр 21, 11:51    [22307537]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов,

Нужно сделать демку туда обратно с фразой: "Мама мыла раму"
12 апр 21, 11:59    [22307551]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
Примерно это и сделано.
Я знаю, как выглядит строка до шифрования, знаю ключ, знаю алгоритм шифрования.
12 апр 21, 12:02    [22307554]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Исходная строка судя по всему 375443C1E58F3847 binHex кодированная. Тоесть на выходе нужно получить
тоже вид BinHex кодирования.

Разрешенные символы - это [0..9] и от [A..F]. Налицо элементарная ошибка с binhex кодированием.

Кстати где оно?
12 апр 21, 12:16    [22307567]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов
Примерно это и сделано.
Я знаю, как выглядит строка до шифрования, знаю ключ, знаю алгоритм шифрования.
код примера где? С исходной строкой?

Сообщение было отредактировано: 12 апр 21, 12:23
12 апр 21, 12:30    [22307588]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
Кода нет, шифрование происходит в веб приложении, его делаю не я и доступа к нему у меня нет.
Со слов веб разработчика я знаю исходную строку, ключ, и то, что он мне присылает. Там вообще код не на Java.
12 апр 21, 12:35    [22307589]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов,
Еще раз.
Я бы на личном компе или на тестовой площадке поставил либу и сделал пример.
А так, дело твоё.
Проверить что вход ПРАВИЛЬНЫЙ же невозможно.
12 апр 21, 12:39    [22307591]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Вот тут еще можно посмотреть примеры https://stackoverflow.com/questions/40209218/java-des-encryption-output-encoding

Я точно не помню все протокольные действия. Надо толко помнить что DES оперирует ключами и блоками в 64 бит и ключик
имеет в 56 бит. Соотв какие-бы мы пароли не придумывали - мощность множества ключей не очень велика.

И есть также такое свойство у DES что шифрование и дешифрование блока в нем алгоримически неразличимы.

Режим ECB - это самый жлобский режим сцепления блоков при котором обратной связи нет вообще.
Тоесть каждый блок будет независим.

И при работе с Hex кодировками - должен быть принцип бутерброда. Тоесть если ты сначала сделал decodeHex,
то наверное где-то должен прилететь encodeHex.

И byte[] нельзя преобразовывать в строку напрямую. Иначе непечатные символы сломают консоль вывода.
12 апр 21, 12:42    [22307596]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
Для эксперимента сделал следующее:
private String cryptCode(String code, String str) throws DecoderException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, UnsupportedEncodingException {
        Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");

        String pan = CODE_PREFIX + str.substring(str.length() - 1 - 12, str.length() - 1);
        byte[] bytesCode = decodeHex(code.toCharArray());
        byte[] bytesPan = decodeHex(pan.toCharArray());
        byte[] bytesTpk = decodeHex(CODE_ENCRYPTED_KEY.toCharArray());
        byte[] bytesOut = new byte[8];
        Arrays.fill(bytesOut, (byte) 0xff);
        bytesOut[0] = 4;             
        bytesOut[1] = bytesCode[0];
        bytesOut[2] = bytesCode[1];

        for (int i = 0; i < bytesPan.length; i++) {
            bytesOut[i] = (byte) (((int) bytesOut[i]) ^ ((int) bytesPan[i]));
        }
        System.out.println(new String(bytesOut, StandardCharsets.UTF_8));
        String bytes = "";
        for(int i = 0; i < bytesOut.length; i++) {
            bytes += (bytesOut[i] + " ");
        }
        System.out.println(bytes.trim());
        byte[] fullKey = new byte[24];
        System.arraycopy(bytesTpk, 0, fullKey, 0, 16);
        System.arraycopy(bytesTpk, 0, fullKey, 16, 8);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(fullKey, "DESede"));
        char[] chars = encodeHex(cipher.doFinal(bytesOut));
        String res = new String(chars);
        System.out.println(res);
        return decryptPin(res);
    }
    //Дешифрование
    private String decryptCode(String code) throws DecoderException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, UnsupportedEncodingException {
        byte[] bytesTpk = decodeHex(CODE_ENCRYPTED_KEY.toCharArray());
        byte[] fullKey = new byte[24];
        System.arraycopy(bytesTpk, 0, fullKey, 0, 16);
        System.arraycopy(bytesTpk, 0, fullKey, 16, 8);
        Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(fullKey, "DESede"));
        byte[] bytesCode = decodeHex(code.toCharArray());
        byte[] decrypted = cipher.doFinal(bytesCode);
        String retVal = new String(decrypted, StandardCharsets.UTF_8);
        String bytes = "";
        for(int i = 0; i < decrypted.length; i++) {
            bytes += (decrypted[i] + " ");
        }
        System.out.println(bytes.trim());
        System.out.println(retVal);
        return retVal;
    }

В консоли получаю следующее:

6��{��
4 18 54 -97 -17 123 -6 -116
5da36c1341809dff
4 18 54 -97 -17 123 -6 -116
6��{��
Из этого делаю вывод, что при дешифровании получаю тот же массив байт, который зашифровал.
Чтобы получить исходную строку, мне надо сделать обработку, обратную этой:
for (int i = 0; i < bytesPan.length; i++) {
            bytesOut[i] = (byte) (((int) bytesOut[i]) ^ ((int) bytesPan[i]));
        }

Или я не прав?
Если я не прав, подскажите пожалуйста, в чем я не прав.
Если прав - подскажите пожалуйста, как сделать эту обработку.

Сообщение было отредактировано: 12 апр 21, 16:42
12 апр 21, 16:43    [22307740]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов,

А где main() или вызов этих двух функций выше?
12 апр 21, 17:07    [22307757]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
Эти функции у меня находятся внутри приложения, вызываю их по REST из jMeter
12 апр 21, 17:09    [22307759]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
main{
var s = code("Мама мыла раму“)
var s2 = decode(s) ;
}
12 апр 21, 17:10    [22307760]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов
Эти функции у меня находятся внутри приложения, вызываю их по REST из jMeter

А утилитными нельзя сделать?
12 апр 21, 17:11    [22307761]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Павел Гужанов
Member

Откуда: Наро-Фоминск
Сообщений: 507
public void main(String[] args) throws NoSuchPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
       System.out.println(cryptCode("1234", "1234567812345678"));
}
12 апр 21, 17:22    [22307774]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8254
Павел Гужанов,
Дорогой. Работать будешь для других?
Утилитный класс это значит ничего лишнего. И запускается любым мембером тут на форуме. Скопипастил себе и запустился.
У тебя в консоли запустилось?
12 апр 21, 17:55    [22307798]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
Sergunka
Member

Откуда: Bay Area, CA
Сообщений: 2517
У меня есть довольно древний пример 7 летней давности как делать что-то навроде. Надеюсь он еще работает

https://github.com/SVyatkin/aes-crypto-example

Я даже в блоге детально расписал
https://vyatkins.wordpress.com/2013/12/06/cryptography-advanced-encryption-standard-aes-and-hash-java-based-examples/

Попробуйте по аналогии заодно проверите работает или нет
12 апр 21, 21:25    [22307855]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
maxkar
Member

Откуда:
Сообщений: 170
Павел Гужанов
Из этого делаю вывод, что при дешифровании получаю тот же массив байт, который зашифровал.

Бинго! Было бы странно, если бы дешифрование давало другой массив байт.

Павел Гужанов
Если прав - подскажите пожалуйста, как сделать эту обработку.

Для xor прямая и обратная обработка совпадают. Вынесите ее в метод и применяйте.
20 апр 21, 09:51    [22311336]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Гужанов. Ну чо? Получилось?
27 апр 21, 13:04    [22315028]     Ответить | Цитировать Сообщить модератору
 Re: Cipher дешифрование  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
Пропал куда-то. Или получилось. Или ушел из it.
12 май 21, 17:44    [22321127]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить