내 개인 키를 보호하는 PKCS11 호환 암호화 장치를 사용하고 있습니다. 암호화 장치는 초당 500 개의 RSA-2048 비트 서명을 생성 할 수 있습니다. PKCS11Interop Wrapper와 인터페이스 된 C# .NET의 응용 프로그램을 작성했습니다. 내 코드는 다음과 같습니다.멀티 스레드 시그니처 생성 C#
#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 영입을 달성 할 수 있지만, 결코 내 암호화 OEM에 의해 지정된 500signings의 속도. 적어도 초당 440 ~ 480 회의 서명이 필요합니다. 순차적 ''루프를 사용하여 어떻게 이것을 수행 할 수 있습니까?
내 UNMANAGED 병렬 루프가 항상 예외를 throw하는 이유는 무엇입니까? 이러한 예외를 처리하더라도 서명의 40 %가 실패합니다 (session.Sign() 함수는 null을 반환 함). 왜 그래야만하지?
"MANAGED Parallel Loop"코드를 사용하면 Sequential Signing Loop에서 얻은 최대 속도 인 280을 얻을 수 있습니다. 내 관리 병렬 루프가 느린 이유는 무엇입니까? '잠금'때문입니까? 자물쇠를 제거하면이 부분은 UNMANAGED PARALLEL LOOP이됩니다. 어떻게 처리 할 수 있습니까?
당신이 생각한다면, 내 멀티 스레딩 코딩 (및 전체 PKCS11 프로그래밍 및 운영이) 잘못 나에게 최대 속도를 달성하기 위해 몇 가지 방법을 제안 해주십시오.
느낀다면 PCKS11Interop Wrapper가 속도를 낼 수없는 문제가있을 수 있으므로 다른 래퍼를 제안하십시오. NCryptoki, Pkcs11.Net Wrappers를 사용했지만 최대 속도를 얻을 수 없었습니다.
내 PKCS11 준수 장치가 500Signings을 생성 할 수 있다고 100 % 확신합니다. 나는 이것을 나의 OEM과 확인했다. 단지 프로그래밍 방식 (C# 또는 Java)을 통해 장치를 작동 할 때 속도가 저하됩니다.
나는이 포럼의 전문가에게 위에서 6 점을 명확히하기를 요청합니다.
많은 감사.
Karthick