0
static string pkcs11LibraryPath = @"C:\Windows\System32\eTPKCS11.dll";    
using (Pkcs11 pkcs11 = new Pkcs11(pkcs11LibraryPath, AppType.SingleThreaded))
{
    // Get list of available slots with token present
    List<Slot> slots = pkcs11.GetSlotList(SlotsType.WithTokenPresent);

    // Find first slot with token present
    Slot slot = slots[0];

    // Open RO session
    using (Session session = slot.OpenSession(SessionType.ReadWrite))
    {
        session.Login(CKU.CKU_USER, "654321");//HSM:123456

        for (int i = 0; i <= slot.GetMechanismList().Count - 1; i++)
        {
            Console.WriteLine(slot.GetMechanismList()[i].ToString());
        }

        // Prepare attribute template that defines search criteria
        List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
        //objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "test"));//HSM:KEY_028_04
        objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));

        // Initialize searching
        session.FindObjectsInit(objectAttributes);

        // Get search results
        List<ObjectHandle> foundObjects = session.FindObjects(2);

        // Terminate searching
        session.FindObjectsFinal();

        ObjectHandle objectHandle = foundObjects[0];

        byte[] iv = Encoding.UTF8.GetBytes("00000000");
        byte[] inputData = Encoding.UTF8.GetBytes("data to encrypt.");


         Mechanism mechanism = new Mechanism(CKM.CKM_DES3_CBC, iv);;//HSM: CKM_DES3_CBC

        byte[] result = session.Encrypt(mechanism, objectHandle, inputData);

        Console.WriteLine(Convert.ToBase64String(result));
    }
}

我得到了Net.Pkcs11Interop.Common.Pkcs11Exception: 'Method C_EncryptInit returned CKR_KEY_TYPE_INCONSISTENT'错误byte[] result = session.Encrypt(mechanism, objectHandle, inputData);

我正在使用 safenet 5100 etoken 你能帮忙吗?

4

1 回答 1

3

您似乎遇到了最常见的问题,因此您使用的搜索模板过于宽泛。使用您的搜索模板,您将找到所有已CKA_TOKEN设置为CK_TRUE值的对象。这意味着所有证书、所有非对称(例如 RSA)密钥、所有对称密钥(例如 AES)、所有数据对象以及存储在您设备中的所有其他内容。

然后,您正在使用第一个找到的对象(RSA 密钥?AES 密钥?没有人知道......),CKM_DES3_CBC该机制需要类型的密钥,CKK_DES3并且C_EncryptInit函数抱怨您通过返回CKR_KEY_TYPE_INCONSISTENT错误提供了不正确的密钥类型。

如果您想确保只找到 3DES 密钥,而不需要使用更具体的搜索模板:

List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
objectAttributes.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK_DES3));

更好地使用CKA_LABEL和/或CKA_ID准确指定您要使用的一个键。并且不要忘记至少阅读 PKCS#11 v2.20 规范的“第 2 章 - 范围”、“第 6 章 - 概述”和“第 10 章 - 对象”。

于 2018-12-06T20:58:53.230 回答