问题描述
我在调用 Qc3EncryptData 以使用三重 DES 加密数据时收到 CPF9DEC(加密服务提供程序无效)错误。我正在为这个“加密服务提供者”参数(参数 8)传递“0”的值。根据 IBM 文档(请参阅下面的链接),“0”值表示任何 CSP(系统将选择合适的 CSP 来执行加密操作)。知道如何通过此错误吗?
https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/qc3encdt.htm#algd0200
以下是我的代码的精简版:
* algorithm DS
D ALGD0200...
D DS qualified
D algorithm 10i 0 inz(21)
D algorithmBlockLen...
D 10i 0 inz(8)
D mode 1 inz('1')
D padOption 1 inz('2')
D padChar 1 inz(x'00')
D reserved 1 inz(x'00')
D MACLen 10i 0 inz(0)
D keySize 10i 0 inz(0)
D inzVector 32 inz('myvector')
* key DS
D KEYD0200...
D DS qualified
D keyType 10i 0 inz(21)
D keyLen 10i 0 inz(24)
D keyFormat 1 inz('0')
D reserved 3 inz(*allx'00')
D key 32 inz('123456789012345678901234')
* error DS
D reffldIBMErrorDS...
D DS qualified template
D totalLen 10I 0 Inz(%size(reffldIBMErrorDS))
D resultLen 10I 0 inz(0)
D msgiD 7A
D reserved 1A inz(x'00')
D msgDta 256A
* ibm encrypt api
D Qc3EncryptData PR extProc('Qc3DecryptData')
D piClearData 65535A options(*varsize) const
D piClearDataLen...
D 10I 0 const
D piClearDataFormatName...
D 8 const
D piAlgorithm 64A const options(*varsize)
D piAlgorithmFormat...
D 8A const
D piKeyDesc 512A const options(*varsize)
D piKeyFormat 8A const
D piCryptoServiceProvider...
D 1A Const
D piCryptoDeviceName...
D 10A Const options(*omit)
D piEncData 65535A options(*varsize)
D piEncDataSize 10I 0 const
D piEncDataLen 10I 0
D piApiErrorDS likeds(reffldIBMErrorDS)
D options(*varsize)
D myClearData s 3000 inz('Hello World')
D myEncData s 65535A
D myEncDataLen s 10I 0
D myIBMApiErr ds likeDS(reffldIBMErrorDS)
D inz(*likeds)
/free
// encrypt the data
Qc3EncryptData(myClearData :%len(%trimr(myClearData))
:'DATA0100'
:ALGD0200 :'ALGD0200'
:KEYD0200 :'KEYD0200'
:'0' :' '
:myEncData :%size(myEncData)
:myEncDataLen :myIBMApiErr
);
*inlr = *on;
/end-free
解决方法
我发现了问题。在我的原型中,我将 extproc 作为 Qc3DecryptData。应该是 Qc3EncryptData
D Qc3EncryptData PR extProc('Qc3DecryptData')