powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_crypto.Encrypt
4 сообщений из 4, страница 1 из 1
dbms_crypto.Encrypt
    #36611193
Shurikas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, столкнулся с проблемой.

Внешнее приложение должно передавать зашифрованную строку серверу Oracle, где должна произойти её дешифровка. Шифровку необходимо делать по алгоритму DES.
Поскольку внешнее приложение на Delphi, то поискав в инете, нашел несколько реализаций алгоритма DES, выбрал одну из них. Дабы полностью не верить автору - сравнил алгоритм и перестановочные таблицы с описанием алгоритма в Википедии .
С незначительными корректировками (у автора были ошибки в перестановочных таблицах) реализация оказалась рабочей, по крайней мере шифровку/дешифровку внутри себя выполняет прекрасно.
Однако мне так и не удалось добиться, чтобы результат шифровки строки в Oracle и результат шифровки в Delphi совпадали.

Например в Oracle
Шифровка DBMS_CRYPTO и DBMS_OBFUSCATION_TOOLKIT
Исходный скрипт
Код: plaintext
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.
declare
    v_key raw( 32767 );
    v_str raw( 32767 );
    v_encrypted_str raw( 32767 );
    v_decrypted_str raw( 32767 );
begin
    -- Формируем исходные данные
    v_str := utl_raw.cast_to_raw('abcabc12');
    v_key := utl_raw.cast_to_raw('12345678');
    dbms_output.put_line('Исходные данные');
    dbms_output.put_line('v_str:           ' || utl_raw.cast_to_varchar2(v_str));
    dbms_output.put_line('v_key:           ' || utl_raw.cast_to_varchar2(v_key));
    dbms_output.put_line('Source RAW:      ' || v_str);

    -- Тестируем DBMS_CRYPTO
    v_encrypted_str := dbms_crypto.Encrypt(
        typ => DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO, 
        src => v_str,
        key => v_key);
    v_decrypted_str := dbms_crypto.Decrypt(
        typ => DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO,
        src => v_encrypted_str,
        key => v_key);
    dbms_output.put_line('');
    dbms_output.put_line('DBMS_CRYPTO');
    dbms_output.put_line('v_encrypted_str: ' || utl_raw.cast_to_varchar2(v_encrypted_str));
    dbms_output.put_line('v_decrypted_str: ' || utl_raw.cast_to_varchar2(v_decrypted_str));
    dbms_output.put_line('Encrypted RAW:   ' || v_encrypted_str);
    dbms_output.put_line('Decrypted RAW:   ' || v_decrypted_str);

    -- Тестируем DBMS_OBFUSCATION_TOOLKIT
    dbms_obfuscation_toolkit.DESEncrypt(
        input => v_str, 
        key => v_key, 
        encrypted_data => v_encrypted_str);
    dbms_obfuscation_toolkit.DESDecrypt(
        input => v_encrypted_str, 
        key => v_key, 
        decrypted_data => v_decrypted_str);
    dbms_output.put_line('');
    dbms_output.put_line('DBMS_OBFUSCATION_TOOLKIT');
    dbms_output.put_line('v_encrypted_str: ' || utl_raw.cast_to_varchar2(v_encrypted_str));
    dbms_output.put_line('v_decrypted_str: ' || utl_raw.cast_to_varchar2(v_decrypted_str));
    dbms_output.put_line('Encrypted RAW:   ' || v_encrypted_str);
    dbms_output.put_line('Decrypted RAW:   ' || v_decrypted_str);
end;

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Исходные данные
v_str:           abcabc12
v_key:            12345678 
Source RAW:       6162636162633132 
 
DBMS_CRYPTO
v_encrypted_str: с_Лyw?K
v_decrypted_str: abcabc12
Encrypted RAW:   F15FCB79773F0B4B
Decrypted RAW:    6162636162633132 
 
DBMS_OBFUSCATION_TOOLKIT
v_encrypted_str: с_Лyw?K
v_decrypted_str: abcabc12
Encrypted RAW:   F15FCB79773F0B4B
Decrypted RAW:    6162636162633132 
Получаем в битовом представлении:
Исходная строка: 0110000101100010011000110110000101100010011000110011000100110010
Зашифрованная строка: 1111000101011111110010110111100101110111001111110000101101001011
Расшифрованная строка: 0110000101100010011000110110000101100010011000110011000100110010



В Delphi
Результат выполнения прикрепленной программы
Исходная строка: 0110000101100010011000110110000101100010011000110011000100110010
Зашифрованная строка: 0111011101010001111101010100111110001010010010110011000100101111
Расшифрованная строка: 0110000101100010011000110110000101100010011000110011000100110010


Получилось, что внутренние шифровки/расшифровки и там и там работаю нормально, но почему результаты шифровки не совпадают? Это не позволяет шифровать данные на клиенте и передавать их для расшифровки на сервер.

Подскажите, пожалуйста, чего я не учитываю, или не знаю.
Заранее спасибо!
...
Рейтинг: 0 / 0
dbms_crypto.Encrypt
    #36611493
iehf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurikas,

Может в этом дело:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
In the CBC mode of a block cipher, the plaintext block i is XORed with the
previous ciphertext block i-1 before it is encrypted.  Usually, a random seed
is used for the first block  that is sent along with the ciphertext.

The Oracle implementation uses a fixed seed (0123456789ABCDEF). CBC mode
enhances security because every block depends on its predecessors and thus
makes breaking of the code or tampering with it more difficult.

У Вас в Делфи (не смог скачать и посмотреть) что используется в качестве начальной синхропосылки?
...
Рейтинг: 0 / 0
dbms_crypto.Encrypt
    #36613033
Shurikas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iehf, Разобрался.
Действительно CBC - это тоже было неправильно в моем случае, сейчас использую ECB. И также необходимо при преобразовании в RAW указывать кодировку.
Очень много проблем было в Delphi-коде.
После переделки всё сошлось.
Oracle в данном случае всё делает по стандартному алгоритму, использую стандартные таблицы перестановок.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
dbms_crypto.Encrypt
    #39522562
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurikas

можете выложить исходник Delphi где исправлены все проблемы и все сходится ?

Вторые сутки тоже не получается победить задачу.
Заранее благодарен.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_crypto.Encrypt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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