Safenet 5100 的 PKCS 库
PKCS Library for Safenet 5100
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));
}
}
我在 byte[] result = session.Encrypt(mechanism, objectHandle, inputData);
中收到错误 Net.Pkcs11Interop.Common.Pkcs11Exception: 'Method C_EncryptInit returned CKR_KEY_TYPE_INCONSISTENT'
我正在使用 safenet 5100 etoken 你能帮忙吗?
您似乎在点击 most common issue,因此您使用的搜索模板过于宽泛。使用您的搜索模板,您将找到 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
and/or CKA_ID
来准确指定您要使用的一个键。并且不要忘记至少阅读 PKCS#11 v2.20 规范的 "Chapter 2 - Scope"、"Chapter 6 - General overview" 和 "Chapter 10 - Objects"。
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));
}
}
我在 byte[] result = session.Encrypt(mechanism, objectHandle, inputData);
Net.Pkcs11Interop.Common.Pkcs11Exception: 'Method C_EncryptInit returned CKR_KEY_TYPE_INCONSISTENT'
我正在使用 safenet 5100 etoken 你能帮忙吗?
您似乎在点击 most common issue,因此您使用的搜索模板过于宽泛。使用您的搜索模板,您将找到 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
and/or CKA_ID
来准确指定您要使用的一个键。并且不要忘记至少阅读 PKCS#11 v2.20 规范的 "Chapter 2 - Scope"、"Chapter 6 - General overview" 和 "Chapter 10 - Objects"。