2017-04-04 7 views
2

내 개인 키를 보호하는 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 

여기 있습니다! 순차 서명 루프 지역으로

  1. , 방금 250-280 영입을 달성 할 수 있지만, 결코 내 암호화 OEM에 의해 지정된 500signings의 속도. 적어도 초당 440 ~ 480 회의 서명이 필요합니다. 순차적 ''루프를 사용하여 어떻게 이것을 수행 할 수 있습니까?

  2. 내 UNMANAGED 병렬 루프가 항상 예외를 throw하는 이유는 무엇입니까? 이러한 예외를 처리하더라도 서명의 40 %가 실패합니다 (session.Sign() 함수는 null을 반환 함). 왜 그래야만하지?

  3. "MANAGED Parallel Loop"코드를 사용하면 Sequential Signing Loop에서 얻은 최대 속도 인 280을 얻을 수 있습니다. 내 관리 병렬 루프가 느린 이유는 무엇입니까? '잠금'때문입니까? 자물쇠를 제거하면이 부분은 UNMANAGED PARALLEL LOOP이됩니다. 어떻게 처리 할 수 ​​있습니까?

  4. 당신이 생각한다면, 내 멀티 스레딩 코딩 (및 전체 PKCS11 프로그래밍 및 운영이) 잘못 나에게 최대 속도를 달성하기 위해 몇 가지 방법을 제안 해주십시오.

  5. 느낀다면 PCKS11Interop Wrapper가 속도를 낼 수없는 문제가있을 수 있으므로 다른 래퍼를 제안하십시오. NCryptoki, Pkcs11.Net Wrappers를 사용했지만 최대 속도를 얻을 수 없었습니다.

  6. 내 PKCS11 준수 장치가 500Signings을 생성 할 수 있다고 100 % 확신합니다. 나는 이것을 나의 OEM과 확인했다. 단지 프로그래밍 방식 (C# 또는 Java)을 통해 장치를 작동 할 때 속도가 저하됩니다.

나는이 포럼의 전문가에게 위에서 6 점을 명확히하기를 요청합니다.

많은 감사.

Karthick

답변

2

은 각 서명 작업에 새로운 Session을 작성해야합니다.

"제 6 장 - 일반 개요"PKCS#11 v2.20 사양을 읽으십시오. (세션에서 제공하는 스레드/작동 분리 포함) PKCS # 11 API의 모든 기본 개념이 설명되어 있습니다.

이 필수 독서를 마친 후에는 Pkcs11Interop.PDF 프로젝트의 Pkcs11RsaSignature 클래스를 살펴보고 작동 코드 샘플을 얻을 수 있습니다.