使用清除密钥进行3DES加密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用清除密钥进行3DES加密相关的知识,希望对你有一定的参考价值。
我正在尝试使用以下界面编写Cobol程序:
Objective
接收明确的加密密钥和明文,并使用3DES算法返回加密文本。
Inputs:
- CLEAR_KEY:一个32个字符的十六进制字符串,用作加密密钥。
- CLEAR_TEXT:一个16个字符的字符串。
Output:
- CYPHERED_TEXT:一个16个字符的字符串。
我可以访问DB2和ICSF callable services。
我尝试了这三种方法:
Using 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.
Using 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.
Using DB2's 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.
但这些方法都没有返回我预期的结果。我期望的结果与在本网站上测试获得的结果相同: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程序中获得上述结果?
谢谢!
您的大多数混淆似乎来自于您将十六进制字符串误认为字节值这一事实。例如。当你传递一个以'2DF65FD88EA9E17E3C66950387F91DE2'X
开头的32字节字符串时,你认为你传递了CSNBSYE一个16字节的'F2C4C6F6F5C6C429F8'X
密钥 - 即你传递的字符的EBCDIC表示。要使用字节值的实际十六进制表示,您必须在文字的结束撇号后附加X
。
另请注意,将qazxsw poi移动到qazxsw poi项目会导致ZERO
,而使用PIC X
会导致'F0'X
。
另一点是,您似乎将来自网站的3DES结果与来自CSNBECO或CSNBSYE的DES结果进行比较 - 但它们是不同的密码,因此应该返回不同的结果。
最后但并非最不重要的LOW-VALUE
:此函数使用3DES,但它不接受普通键。相反,第二个参数是经过哈希处理以获取最终加密密钥的密码。
因此,对于您所研究的替代方案,似乎只有CSNBSYE符合您的要求,但您必须研究其确切的参数格式和用法。
我做的!代码如下:
'00'
所以,缺少的是:1)将32字节的十六进制字符串转换为它的16字节字符串表示。 2)链数据大小为32。
以上是关于使用清除密钥进行3DES加密的主要内容,如果未能解决你的问题,请参考以下文章