2017-04-04 41 views
2

我正在使用PKCS11標準的加密設備來保護我的私鑰。加密設備每秒能夠產生500個RSA-2048位信號。我用C#.NET編寫了一個與PKCS11Interop Wrapper接口的應用程序。這裏是我的代碼:多線程簽名生成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個引援。我如何使用Sequential'for'循環來實現此目的?

  2. 爲什麼我的UNMANAGED Parallel循環總是拋出異常?即使我處理這些異常,40%的簽名失敗(session.Sign()函數返回null)。爲什麼這樣?

  3. 使用「管理的並行循環」代碼,我可以達到280的最大速度,正如我在Sequential Signing Loop中獲得的那樣。爲什麼我的MANAGED Parallel循環很慢?是因爲''?如果我刪除,它將成爲UNMANAGED PARALLEL LOOP。我該如何處理?

  4. 如果您覺得我的多線程編碼(以及整個PKCS11編程和操作)是錯誤的,請爲我提供一些方法來達到最大速度。

  5. 如果您覺得PCKS11Interop Wrapper可能存在問題,但它不會讓我達到這個速度,請推薦其他一些包裝。我使用了NCryptoki,Pkcs11.Net Wrappers,但我無法達到最高速度。

  6. 我100%確信我的PKCS11兼容設備能夠產生500個信號。我與我的OEM確認了這一點。只有當我通過編程(C#或Java)來操作設備時,速度會下降。

我請這個論壇的專家來澄清我以上6點。

很多謝謝。

Karthick

回答

2

你需要爲每個簽名操作,創建新的Session

請閱讀「第6章 - 總體概述」PKCS#11 v2.20規範。那裏解釋了PKCS#11 API的所有基本概念(包括由會話提供的線程/操作隔離)。

完成此強制性閱讀後,您可以查看Pkcs11Interop.PDF項目中的Pkcs11RsaSignature類,瞭解有效的代碼示例。