小编use*_*762的帖子

PKCS11 deriveKey()和encrypt()返回3DES的不同结果

我正在使用HSM和PKCS11处理密钥派生问题,目前我无法理解为什么我看到完全不同的结果取决于我是否使用deriveKey()方法而不是使用encrypt()方法.在这两种情况下,我都试图使用DESede/ECB/NoPadding算法来获得结果,但是根据我用来生成结果的方法(deriveKey与加密),我看到了不同的结果.

退一步以提供高级概述......我正在使用Global Platform使用的特定密钥派生方法来使用于智能卡的主密钥多样化.该方法以主密钥和用于导出新密钥的8字节数据(多样化数据)开始.div数据字节实际上只是使用DESede/ECB/NoPadding用主密钥加密,结果用作新导出的3DES密钥的一部分.(实际上,执行了多次加密,并将结果连接在一起形成新密钥,但这不是问题.)

我在两种情况下都验证了主密钥,验证了两种情况下的多样化数据是相同的,验证我使用相同的算法和相同的填充.我也尝试将派生密钥模板更改为DES,2DES,3DES.所有产生的结果都相似,只是长度不同.

目前我已经使用IAIK包装器(用Java编写的pkcs11包装器)实现了我的测试用例,我将在此处发布.密钥只是一个测试密钥,div数据是样本div数据,所以这里没有敏感信息.我首先在HSM中创建基本密钥,然后尝试使用多样化数据调用session.deriveKey()来获取新密钥.派生的关键字节以十六进制打印(键值不正确,基于我当前工作的实现,它在内存中而不是在HSM中导出密钥).接下来,我只是初始化会话以使用主密钥执行加密,然后加密多样化数据.这会产生预期值(再次根据工作实现进行检查).

当我使用相同的基本密钥,相同的div数据和相同的加密算法时,我正在寻找的是对这些操作产生不同结果的原因的任何了解.我不明白deriveKey()在表面下做了什么,我无法找到任何文档或源代码来阐明这一点.我必须能够使用deriveKey()方法,因为派生密钥在HSM外部不可用.

有任何见解赞赏.

Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_DES3_KEY_GEN);

List supportedMechanisms = Arrays.asList(token.getMechanismList());
if (!supportedMechanisms.contains(Mechanism.get(PKCS11Constants.CKM_DES3_KEY_GEN))) {
    output_.println("Mechanism not supported: DES3_KEY_GEN");
    return;
}

// This is the master key that I want to diversify
DES3SecretKey baseKeyTemplate = new DES3SecretKey();
baseKeyTemplate.getValue().setByteArrayValue(new byte[] {0x3d, 0x20, 0x5b, 0x29, (byte) 0xfd, 0x04, (byte) 0xd9, (byte) 0x89, (byte) 0xd0, (byte) 0xfd, (byte) 0x85, (byte) 0xd5, (byte) 0xf7, (byte) 0xb3, 0x31, (byte) 0xd3,
        0x3d, 0x20, 0x5b, 0x29, (byte) 0xfd, 0x04, (byte) 0xd9, (byte) 0x89});
baseKeyTemplate.getDerive().setBooleanValue(Boolean.TRUE); …
Run Code Online (Sandbox Code Playgroud)

java 3des pkcs#11 hsm

4
推荐指数
1
解决办法
3381
查看次数

标签 统计

3des ×1

hsm ×1

java ×1

pkcs#11 ×1