为什么sign方法仅返回四个字节?

时间:2019-07-16 09:04:33

标签: pkcs#11 pkcs11interop

我正在尝试使用pkcs11interop来实现pkcs 11标准

我有一些des2键(16字节),我想使用符号方法

我的问题是sign方法仅返回四个字节。但我想要8个字节的符号。

我该怎么办?

PS 1:四字节结果正确。那是我预期结果的前一个字节。

PS 2:我知道签名方法与加密方法相同。所以我的解决方案之一是加密输入并获得结果的前8个字节(这就是我已经在做的)。但是我对此感到难过,我认为最好使用Sign方法本身。

PS 3:有一个“ ICkMacGeneralParams”界面,可用于选择MAC大小。但似乎根本不起作用!我将其设置为UInt32.MaxValue和0,结果没有不同。

PS 4:我知道通常用于公钥和私钥的Sign方法。但我需要一键使用

        var data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };

        //macParams seems not to work at all! result remains same with any input of CreateCkMacGeneralParams method
        var macParams = session.Factories.MechanismParamsFactory.CreateCkMacGeneralParams(8);

        var signMechanism = session.Factories.MechanismFactory.Create(CKM.CKM_DES3_MAC, macParams);
        //handle references to some 16 byte key with CKK_DES2
        var signResult = session.Sign(signMechanism, handle, data);
        //result is always 4 bytes

1 个答案:

答案 0 :(得分:1)

机制CKM_DES3_MAC总是为DES提供4字节的输出,引用“ PKCS#11 v2.20”,第12.13.14节:

  

它总是产生的输出大小是块大小的一半。

您需要使用CKM_DES3_MAC_GENERAL,它允许签名长度达到DES块大小(请参阅12.13.13节)。所需的签名长度在机制参数CK_MAC_GENERAL_PARAMS中指定。

如果您的令牌支持此机制,则以下代码应该有效:

var data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

var macParams = session.Factories.MechanismParamsFactory.CreateCkMacGeneralParams(8);
var signMechanism = session.Factories.MechanismFactory.Create(CKM.CKM_DES3_MAC_GENERAL, macParams);
    var signResult = session.Sign(signMechanism, handle, data);

祝你好运!