使用清除密钥进行3DES加密

Mar*_*iro 2 encryption db2 cobol 3des zos

我正在尝试使用以下界面编写Cobol程序:

目的

接收明确的加密密钥和明文,并使用3DES算法返回加密文本.

输入:

  • CLEAR_KEY:一个32个字符的十六进制字符串,用作加密密钥.
  • CLEAR_TEXT:一个16个字符的字符串.

输出:

  • CYPHERED_TEXT:一个16个字符的字符串.

我可以访问DB2ICSF可调用服务.

我尝试了这三种方法:

使用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.
Run Code Online (Sandbox Code Playgroud)

使用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.
Run Code Online (Sandbox Code Playgroud)

使用DB2的ENCRYPT_TDES

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.
Run Code Online (Sandbox Code Playgroud)

但这些方法都没有返回我预期的结果.我期待的结果与本网站测试结果相同: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áï=ò'(STRING)

我的问题是:如何使用IBM提供的任何工具在Cobol程序中获得上述结果?

谢谢!

pie*_*t.t 5

您的大多数混淆似乎来自于您将十六进制字符串误认为字节值这一事实.例如,'2DF65FD88EA9E17E3C66950387F91DE2'X当您传递一个32字节的字符串时,您认为传递CSNBSYE是一个16字节的密钥'F2C4C6F6F5C6C429F8'X- 也就是您传递的字符的EBCDIC表示.要使用字节值的实际十六进制表示,您必须X在文字的结束撇号之后追加a .

另请注意,在使用结果时ZERO移入PIC X项目会导致进入.'F0'XLOW-VALUE'00'

另一点是,您似乎将来自网站的3DES结果与来自CSNBECO或CSNBSYE的DES结果进行比较 - 但它们是不同的密码,因此应该返回不同的结果.

最后但并非最不重要ENCRYPT_TDES:此功能正在使用3DES,但它不接受普通键.相反,第二个参数是经过哈希处理以获取最终加密密钥的密码.

因此,对于您所研究的替代方案,似乎只有CSNBSYE符合您的要求,但您必须研究其确切的参数格式和用法.