powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Cipher дешифрование
19 сообщений из 19, страница 1 из 1
Cipher дешифрование
    #40061642
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Получаю от веб приложения зашифрованную строку вида "375443C1E58F3847"
Строка зашифрована алгоритмом triple DES с использованием библиотеки https://github.com/hosseinmd/data-crypto/blob/master/src/tripleDes.ts
Пытаюсь расшифровать полученное:
Код: java
1.
2.
3.
4.
5.
6.
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�)�

Ключ при шифровании/дешифровании совпадает.
С кодировками игрался, всякий раз получается какая-то чушь.
Подскажите, как правильно дешифровать полученную строку?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061651
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

Нужно сделать демку туда обратно с фразой: "Мама мыла раму"
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061654
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно это и сделано.
Я знаю, как выглядит строка до шифрования, знаю ключ, знаю алгоритм шифрования.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061662
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходная строка судя по всему 375443C1E58F3847 binHex кодированная. Тоесть на выходе нужно получить
тоже вид BinHex кодирования.

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

Кстати где оно?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061676
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Примерно это и сделано.
Я знаю, как выглядит строка до шифрования, знаю ключ, знаю алгоритм шифрования.
код примера где? С исходной строкой?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061677
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кода нет, шифрование происходит в веб приложении, его делаю не я и доступа к нему у меня нет.
Со слов веб разработчика я знаю исходную строку, ключ, и то, что он мне присылает. Там вообще код не на Java.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061679
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Еще раз.
Я бы на личном компе или на тестовой площадке поставил либу и сделал пример.
А так, дело твоё.
Проверить что вход ПРАВИЛЬНЫЙ же невозможно.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061682
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут еще можно посмотреть примеры https://stackoverflow.com/questions/40209218/java-des-encryption-output-encoding

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

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

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

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

И byte[] нельзя преобразовывать в строку напрямую. Иначе непечатные символы сломают консоль вывода.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061770
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для эксперимента сделал следующее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
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��{��
Из этого делаю вывод, что при дешифровании получаю тот же массив байт, который зашифровал.
Чтобы получить исходную строку, мне надо сделать обработку, обратную этой:
Код: java
1.
2.
3.
for (int i = 0; i < bytesPan.length; i++) {
            bytesOut[i] = (byte) (((int) bytesOut[i]) ^ ((int) bytesPan[i]));
        }


Или я не прав?
Если я не прав, подскажите пожалуйста, в чем я не прав.
Если прав - подскажите пожалуйста, как сделать эту обработку.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061782
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,

А где main() или вызов этих двух функций выше?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061784
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эти функции у меня находятся внутри приложения, вызываю их по REST из jMeter
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061785
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
main{
var s = code("Мама мыла раму“)
var s2 = decode(s) ;
}
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061786
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Эти функции у меня находятся внутри приложения, вызываю их по REST из jMeter

А утилитными нельзя сделать?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061791
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
public void main(String[] args) throws NoSuchPaddingException, UnsupportedEncodingException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {
       System.out.println(cryptCode("1234", "1234567812345678"));
}
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061805
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Дорогой. Работать будешь для других?
Утилитный класс это значит ничего лишнего. И запускается любым мембером тут на форуме. Скопипастил себе и запустился.
У тебя в консоли запустилось?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40061837
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть довольно древний пример 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/

Попробуйте по аналогии заодно проверите работает или нет
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40064079
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Из этого делаю вывод, что при дешифровании получаю тот же массив байт, который зашифровал.

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

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

Для xor прямая и обратная обработка совпадают. Вынесите ее в метод и применяйте.
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40066299
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гужанов. Ну чо? Получилось?
...
Рейтинг: 0 / 0
Cipher дешифрование
    #40069730
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пропал куда-то. Или получилось. Или ушел из it.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Cipher дешифрование
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]