Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Cipher дешифрование / 19 сообщений из 19, страница 1 из 1
12.04.2021, 11:51
    #40061642
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cipher дешифрование
Здравствуйте.
Получаю от веб приложения зашифрованную строку вида "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
12.04.2021, 11:59
    #40061651
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cipher дешифрование
Павел Гужанов,

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

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

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

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

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

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

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

И byte[] нельзя преобразовывать в строку напрямую. Иначе непечатные символы сломают консоль вывода.
...
Рейтинг: 0 / 0
12.04.2021, 16:43
    #40061770
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cipher дешифрование
Для эксперимента сделал следующее:
Код: 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
12.04.2021, 17:07
    #40061782
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cipher дешифрование
Павел Гужанов,

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

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

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

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

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


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