我正在使用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
在這裏你去!
與順序簽字環區域,我能達到250-280只引援,但從來沒有爲我的加密OEM指定的500signings的速度。至少我需要每秒440〜480個引援。我如何使用Sequential'for'循環來實現此目的?
爲什麼我的UNMANAGED Parallel循環總是拋出異常?即使我處理這些異常,40%的簽名失敗(session.Sign()函數返回null)。爲什麼這樣?
使用「管理的並行循環」代碼,我可以達到280的最大速度,正如我在Sequential Signing Loop中獲得的那樣。爲什麼我的MANAGED Parallel循環很慢?是因爲'鎖'?如果我刪除鎖,它將成爲UNMANAGED PARALLEL LOOP。我該如何處理?
如果您覺得我的多線程編碼(以及整個PKCS11編程和操作)是錯誤的,請爲我提供一些方法來達到最大速度。
如果您覺得PCKS11Interop Wrapper可能存在問題,但它不會讓我達到這個速度,請推薦其他一些包裝。我使用了NCryptoki,Pkcs11.Net Wrappers,但我無法達到最高速度。
我100%確信我的PKCS11兼容設備能夠產生500個信號。我與我的OEM確認了這一點。只有當我通過編程(C#或Java)來操作設備時,速度會下降。
我請這個論壇的專家來澄清我以上6點。
很多謝謝。
Karthick