Шифрование 3DES с открытым ключом

Я пытаюсь написать программу Cobol со следующим интерфейсом:

Цель

Получает чистый ключ шифрования и открытый текст и возвращает зашифрованный текст с использованием алгоритма 3DES.

Входы:

  • CLEAR_KEY: 32-символьная строка шестнадцатеричных символов, которая будет использоваться в качестве ключа шифрования.
  • CLEAR_TEXT: строка из 16 символов.

Выход:

  • CYPHERED_TEXT: строка из 16 символов.

У меня есть доступ к DB2 и вызываемые службы ICSF.

Я попробовал эти три подхода:

Использование CSNBSYE

77 CSNBSYE                  PIC X(7) VALUE 'CSNBSYE'.
01 CSNBSYE-PARAMETERS.
   02 RETURN-CODE           PIC 9(8) COMP.
   02 REASON-CODE           PIC 9(8) COMP.
   02 EXIT-DATA-LENGTH      PIC 9(8) COMP.
   02 EXIT-DATA             PIC X(32).
   02 RULE-ARRAY-COUNT      PIC 9(8) COMP.
   02 RULE-ARRAY            PIC X(8).
   02 KEY-IDENTIFIER-LENGTH PIC 9(8) COMP.
   02 KEY-IDENTIFIER        PIC X(32).
   02 KEY-PARMS-LENGTH      PIC 9(8) COMP.
   02 KEY-PARMS             PIC X(32).
   02 BLOCK-SIZE            PIC 9(8) COMP.
   02 INIT-VECTOR-LENGTH    PIC 9(8) COMP.
   02 INIT-VECTOR           PIC X(8).
   02 CHAIN-DATA-LENGTH     PIC 9(8) COMP.
   02 CHAIN-DATA            PIC X(16).
   02 CLEAR-TEXT-LENGTH     PIC 9(8) COMP.
   02 CLEAR-TEXT            PIC X(16).
   02 CYPHERED-TEXT-LENGTH  PIC 9(8) COMP.
   02 CYPHERED-TEXT         PIC X(16).
   02 OPTIONAL-DATA-LENGTH  PIC 9(8) COMP.
   02 OPTIONAL-DATA         PIC X(32).

INITIALIZE CSNBSYE-PARAMETERS.

MOVE 1                                  TO RULE-ARRAY-COUNT.
MOVE 'DES     '                         TO RULE-ARRAY.
MOVE 16                                 TO KEY-IDENTIFIER-LENGTH.
MOVE '2DF65FD88EA9E17E3C66950387F91DE2' TO KEY-IDENTIFIER.
MOVE 8                                  TO BLOCK-SIZE
                                           INIT-VECTOR-LENGTH.
MOVE ALL ZEROS                          TO INIT-VECTOR.
MOVE 16                                 TO CHAIN-DATA-LENGTH.
MOVE LOW-VALUES                         TO CHAIN-DATA.
MOVE 16                                 TO CLEAR-TEXT-LENGTH
                                           CYPHERED-TEXT-LENGTH.
MOVE ALL ZEROS                          TO CLEAR-TEXT.

CALL CSNBSYE USING RETURN-CODE,
                   REASON-CODE,           
                   EXIT-DATA-LENGTH,      
                   EXIT-DATA,             
                   RULE-ARRAY-COUNT,      
                   RULE-ARRAY,            
                   KEY-IDENTIFIER-LENGTH, 
                   KEY-IDENTIFIER,        
                   KEY-PARMS-LENGTH,      
                   KEY-PARMS,             
                   BLOCK-SIZE,           
                   INIT-VECTOR-LENGTH,    
                   INIT-VECTOR,           
                   CHAIN-DATA-LENGTH,    
                   CHAIN-DATA,            
                   CLEAR-TEXT-LENGTH,     
                   CLEAR-TEXT,            
                   CYPHERED-TEXT-LENGTH,  
                   CYPHERED-TEXT,         
                   OPTIONAL-DATA-LENGTH,  
                   OPTIONAL-DATA.

Использование CSNBECO

77 CSNBECO                  PIC X(7) VALUE 'CSNBECO'.
01 CSNBECO-PARAMETERS.
   02 RETURN-CODE           PIC 9(8) COMP.
   02 REASON-CODE           PIC 9(8) COMP.
   02 EXIT-DATA-LENGTH      PIC 9(8) COMP.
   02 EXIT-DATA             PIC X(32).
   02 CLEAR-KEY             PIC X(32).
   02 CLEAR-TEXT            PIC X(16).
   02 CYPHERED-TEXT         PIC X(16).

INITIALIZE CSNBECO-PARAMETERS.

MOVE '2DF65FD88EA9E17E3C66950387F91DE2' TO CLEAR-KEY.
MOVE ALL ZEROS                          TO CLEAR-TEXT.

CALL CSNBSYE USING RETURN-CODE,
                   REASON-CODE,           
                   EXIT-DATA-LENGTH,      
                   EXIT-DATA,             
                   CLEAR-KEY,          
                   CLEAR-TEXT,            
                   CYPHERED-TEXT.

Использование ENCRYPT_TDES DB2

01 WS.
   02 CLEAR-TEXT            PIC X(16).
   02 CYPHERED-TEXT         PIC X(16).

   MOVE ALL ZEROS TO CLEAR-TEXT.

   EXEC SQL
        SELECT ENCRYPT_TDES(:CLEAR-TEXT, '2DF65FD88EA9E17E3C66950387F91DE2')
        INTO   :CYPHERED-TEXT
        FROM   SYSIBM.SYSDUMMY1
   END-EXEC.

Но ни один из этих подходов не дал ожидаемого результата. Результат, который я ожидаю, будет таким же, как и при тестировании на этом веб-сайте: http://tripledes.online-domain-tools.com/ со следующими данными:

Тип ввода: текст

Введите текст: 0000000000000000 (HEX)

Функция: 3DES

Режим: CBC

Ключ: 2DF65FD88EA9E17E3C66950387F91DE2 (HEX)

Вектор инициализации: 00 00 00 00 00 00 00 00

Зашифровать!

Зашифрованный текст (результат): 87 30 e1 ef 98 3d f2 b4 (HEX) | . 0 á ï = ò ´ (СТРОКА)

У меня вопрос: как я могу получить вышеуказанный результат в программе Cobol, используя любой из инструментов, предоставляемых IBM?

Спасибо!


person Marcus Vinícius Monteiro    schedule 05.03.2018    source источник


Ответы (2)


Похоже, что большая часть вашей путаницы связана с тем, что вы ошибочно принимаете шестнадцатеричные строки за байтовые значения. Например. вы думаете, что передаете CSNBSYE 16-байтовый ключ '2DF65FD88EA9E17E3C66950387F91DE2'X, в то время как вы передаете 32-байтовую строку, начинающуюся с 'F2C4C6F6F5C6C429F8'X, то есть EBCDIC-представление переданных вами символов. Чтобы использовать фактическое шестнадцатеричное представление байтовых значений, вы должны добавить X после закрывающего апострофа ваших литералов.

Также обратите внимание, что перемещение ZERO в элемент PIC X приводит к 'F0'X, а использование LOW-VALUE приводит к '00'.

Еще один момент заключается в том, что вы, кажется, сравниваете результаты 3DES с веб-сайта с результатами DES от CSNBECO или CSNBSYE, но это разные шифры, и поэтому они должны возвращать разные результаты.

И последнее, но не менее важное ENCRYPT_TDES: эта функция использует 3DES, но не принимает простой ключ. Вместо этого второй аргумент — это пароль, который хешируется для получения окончательного ключа шифрования.

Таким образом, из изученных вами альтернатив кажется, что только CSNBSYE совместим с вашими требованиями, но вы должны изучить его точные форматы параметров и использование.

person piet.t    schedule 05.03.2018

Я сделал это! Код был следующим:

77 CT-cENC-ROUTINE                  PIC X(7) VALUE 'CSNBSYE'.
05 WS-ENC.                                        
   10 WS-ENC-nRETURN-CODE           PIC 9(8) COMP.
   10 WS-ENC-nREASON-CODE           PIC 9(8) COMP.
   10 WS-ENC-nEXIT-DATA-LENGTH      PIC 9(8) COMP.
   10 WS-ENC-cEXIT-DATA             PIC X(4).     
   10 WS-ENC-nRULE-ARRAY-COUNT      PIC 9(8) COMP.
   10 WS-ENC-RULE-ARRAY.                          
      15 WS-ENC-cRULE-ALGO          PIC X(8).     
   10 WS-ENC-cKEY-IDENT-LENGTH      PIC 9(8) COMP.
   10 WS-ENC-cKEY-IDENT             PIC X(32).    
   10 WS-ENC-nKEY-PARMS-LENGTH      PIC 9(8) COMP.
   10 WS-ENC-nKEY-PARMS             PIC X(64).    
   10 WS-ENC-nBLOCK-SIZE            PIC 9(8) COMP.
   10 WS-ENC-nINIT-VECTOR-LENGTH    PIC 9(8) COMP.
   10 WS-ENC-cINIT-VECTOR           PIC X(16).    
   10 WS-ENC-nCHAIN-DATA-LENGTH     PIC 9(8) COMP.
   10 WS-ENC-cCHAIN-DATA            PIC X(32).    
   10 WS-ENC-nCLEAR-TEXT-LENGTH     PIC 9(8) COMP.
   10 WS-ENC-cCLEAR-TEXT            PIC X(16).    
   10 WS-ENC-nCYPHER-TEXT-LENGTH    PIC 9(8) COMP.
   10 WS-ENC-cCYPHER-TEXT           PIC X(16).    
   10 WS-ENC-nOPTIONAL-DATA-LENGTH  PIC 9(8) COMP.
   10 WS-ENC-cOPTIONAL-DATA         PIC X(32).    

INITIALIZE WS-ENC                                          

MOVE 1                          TO WS-ENC-nRULE-ARRAY-COUNT
MOVE 'DES'                      TO WS-ENC-cRULE-ALGO       

EXEC SQL                                                 
     SELECT VARCHAR_BIT_FORMAT('2DF65FD88EA9E17E3C66950387F91DE2')
     INTO   :WS-ENC-cKEY-IDENT                                
     FROM   SYSIBM.SYSDUMMY1                             
END-EXEC       

MOVE 16                         TO WS-ENC-cKEY-IDENT-LENGTH   
MOVE 8                          TO WS-ENC-nBLOCK-SIZE                                          
                                   WS-ENC-nINIT-VECTOR-LENGTH
MOVE ALL ZEROS                  TO WS-ENC-cINIT-VECTOR       

MOVE LENGTH OF WS-ENC-cCHAIN-DATA                            
                                TO WS-ENC-nCHAIN-DATA-LENGTH 
MOVE LOW-VALUES                 TO WS-ENC-cCHAIN-DATA        

MOVE LENGTH OF WS-ENC-cCLEAR-TEXT                            
                                TO WS-ENC-nCLEAR-TEXT-LENGTH 
                                   WS-ENC-nCYPHER-TEXT-LENGTH
MOVE '0000000000000000'         TO WS-ENC-cCLEAR-TEXT        

CALL CT-cENC-ROUTINE USING WS-ENC-nRETURN-CODE,         
                           WS-ENC-nREASON-CODE,         
                           WS-ENC-nEXIT-DATA-LENGTH,    
                           WS-ENC-cEXIT-DATA,           
                           WS-ENC-nRULE-ARRAY-COUNT,    
                           WS-ENC-RULE-ARRAY,           
                           WS-ENC-cKEY-IDENT-LENGTH,    
                           WS-ENC-cKEY-IDENT,           
                           WS-ENC-nKEY-PARMS-LENGTH,    
                           WS-ENC-nKEY-PARMS,           
                           WS-ENC-nBLOCK-SIZE,          
                           WS-ENC-nINIT-VECTOR-LENGTH,  
                           WS-ENC-cINIT-VECTOR,         
                           WS-ENC-nCHAIN-DATA-LENGTH,   
                           WS-ENC-cCHAIN-DATA,          
                           WS-ENC-nCLEAR-TEXT-LENGTH,   
                           WS-ENC-cCLEAR-TEXT,          
                           WS-ENC-nCYPHER-TEXT-LENGTH,  
                           WS-ENC-cCYPHER-TEXT          
                           WS-ENC-nOPTIONAL-DATA-LENGTH,
                           WS-ENC-cOPTIONAL-DATA    

Итак, чего не хватало: 1) Преобразовать 32-байтовую строку шестнадцатеричных символов в ее 16-байтовое строковое представление. 2) Размер данных цепочки был сделан равным 32.

person Marcus Vinícius Monteiro    schedule 05.03.2018
comment
Кажется, вы внесли изменения в соответствии с этим ответом. Если это правильно, было бы неплохо добавить свой код к ответу (вы можете его отредактировать), а затем принять ответ. - person Maarten Bodewes; 05.03.2018