проект для рабочего примера кода.

ользую PKCS11-совместимое криптоустройство, которое защищает мой закрытый ключ. Криптоустройство способно генерировать 500 битовых подписей RSA-2048 в секунду. Я написал приложение на C # .NET с интерфейсом PKCS11Interop Wrapper. Вот мой код:

#region Initialization 
Pkcs11 pkcs11 = new Pkcs11(pkcsLibraryPath, true);

Slot slot = pkcs11.GetSlotList(true)[slotIndex]; 

Session session = slot.OpenSession(false); 

session.Login(CKU.CKU_USER, hsmPIN); 

List<ObjectAttribute> searchObject = new List<ObjectAttribute>(2);

searchObject.Add(new ObjectAttribute(CKA.CKA_CLASS,(uint)CKO.CKO_PRIVATE_KEY));

searchObject.Add(new ObjectAttribute(CKA.CKA_LABEL, keyLabelName));

ObjectHandle privateKeyHandle = session.FindAllObjects(searchObject)[0];

byte[] dataToBeSigned = new byte[500];

byte[] signature = new byte[dataToBeSigned.Length];
#endregion Initialization 

#region SEQUENTIAL Signing Loop 
for(int i = 0; i<500;i++)
{

signature[i] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[i]);

}
#endregion SEQUENTIAL Signing Loop 

#region UNMANAGED Parallel Loop 
Parallel.For(0, dataToBeSigned.Length, index =>
{

signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);

});
#endregion UNMANAGED Parallel Loop 

#region MANAGED Parallel Loop  
Parallel.For(0, dataToBeSigned.Length, index =>
{

lock(session)
{

signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);
}

});
#endregion MANAGED Parallel Loop  

Ну вот!!

Благодаря региону последовательной петли подписи я могу достичь только 250-280 подписей, но никогда не достигать скорости 500 подписей, как указано моим Crypto OEM. По крайней мере, мне нужно 440 ~ 480 подписей в секунду. Как я могу добиться этого с помощью последовательногоза'петля?

Почему мой неуправляемый параллельный цикл всегда генерирует исключение? Даже если я обработаю это исключение, 40% подписей получат ошибку (функция session.Sign () возвращает ноль). Почему это так?

С помощью кода «MANAGED Parallel Loop» я могу достичь максимальной скорости 280, как это было с последовательным циклом подписи. Почему мой управляемый параллельный цикл работает медленно? Это из-зазамок«? Если я удалюзамок, становится НЕПРАВИЛЬНЫМ ПАРАЛЛЕЛЬНЫМ ПЕТЛЯМ. Как я могу справиться с этим?

Если вы чувствуете, что мое многопоточное кодирование (и все программирование и операции PKCS11) неверны, пожалуйста, предложите мне какой-нибудь метод для достижения максимальной скорости.

Если вы чувствуете, что может быть проблема с PCKS11Interop Wrapper, которая не позволяет мне достичь скорости, пожалуйста, предложите некоторые другие оболочки. Я использовал NCryptoki, Pkcs11.Net Wrappers, но не смог добиться максимальной скорости.

Я на 100% уверен, что мое устройство, совместимое с PKCS11, способно генерировать 500 подписей. Я подтвердил это с моим OEM. Только когда я управляю устройством с помощью программного обеспечения (C # или Java), моя скорость снижается.

Прошу экспертов этого форума уточнить меня по вышеуказанным 6 пунктам.

Большое спасибо.

Karthick

Ответы на вопрос(1)

Ваш ответ на вопрос