2010-11-23 7 views
9

Şu anda basit bir veri imzalama parçası üzerinde çalışıyorum. İmzalamayı ilk kez kullanıyorum, belki sadece yanlış bir şey yapıyorum. Ama ben normal bir 512bit RSA ve SHA1 hashing kullanarak 448 bayt imzalamak için 4.6 saniye sürer sanmıyorum.RSACryptoServiceProvider ile oturum açma hızı

kodu:

byte[] Data = enc.GetByte(MsgString); //Get Message as byte[] 
//Data is 448 bytes long 

RSACryptoServiceProvider Crypter = new RSACryptoServiceProvider(512); 
Crypter.ImportCspBlob(Convert.FromBase64String(KeyString)); 

byte[] SignedData = Crypter.SignData(Data, "SHA1"); //Line takes 4.6 seconds 

Bu neden böyle yavaş? Bunu buldum: http://support.microsoft.com/kb/948080, ancak .NET 2.0 bir sorun. 4.0 kullanıyorum.

Bunun uzun sürmesi normal mi, yoksa bir hata mı var?

Yardımlarınız için teşekkür ederiz.

+1

'KeyString' nereden geliyor? –

+0

Sanal makinemde bir Mac OS X ana bilgisayarında bir Win XP konuğu çalıştıran birimde, hiçbir zaman fark edilmez. Ya “Data”, megabayttır, ya da “KeyString”, büyük bir RSA anahtarını ya da her ikisini temsil eder. –

+0

KeyString, daha önce bir RSACryptoProvider'dan aldığım bir dizedir. Base64 kodlamasında sadece 512bit anahtar. Ve Veri kesinlikle sadece bayttır. Onun sadece kısa bir dizesi. – Marks

cevap

-2

Şifreleme işlemlerinin bir süreliğine işleyişinin nedeninin bir sebebi, insanların algoritmanızı zorlamak istemediğinden kaynaklanır. Verilerinizi imzalamak için kullanım durumunuz nedir? Hızlı olmak zorunda mı? Verilerin geçerli olduğundan emin olmak için basit bir kontrol mi yoksa şifrelenmek için ihtiyacınız var mı?

şifreleme konusunda ciddi iseniz şişme kale şeyler kontrol etmek isteyebilirsiniz: noktalarının

http://www.bouncycastle.org/

+4

Soruyla ilgisi yok, çünkü cevap hayır, veriyi 448 bayta imzalamak için bu kadar uzun sürmemelidir. –

0

Çift:

1) Ben de arayarak yüksek verim bulduk SHA1 karma algoritması doğrudan ve daha sonra SignData() yöntemi yerine SignHash() yöntemine geçiriliyor. SignData() yönteminde bir uygulama sorunu olup olmadığından emin değilim, ancak bu benim deneyimim gibi görünüyor.

byte[] hash = new SHA1Managed().ComputeHash(data); 
byte[] SignedData = Crypter.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")); 

2) Bir yöntem çağrısında hepsini yapmak istiyorsan çerçeve sen dize "SHA1") geçerken pahalı ve gecikme katkıda edilebilir (bir arama yapmak için ihtiyaç önlemek yerine aşağıdaki kullanmayı deneyin:

byte[] SignedData = Crypter.SignData(Data, new SHA1CryptoServiceProvider()); 
1

Sadece ben aynı yavaşlık alma SHA1 karmaları imzaladığı yaşadığını belirtmek bildirmek için. Genelde saniyede yüzlerce işlemle imzalanan bazı kodlar, her 5 saniyede 1'e yavaşladı.

Evde çalışıyordum ve şirket ağına bağlı değildim. Bir kaç olaydan sonra, suçluyu tespit etmeyi başardım. Bir hata, RSACryptoServiceProvider'ı .NET Framework 2.0 üzerinde düzeltmek gibi görünüyor.

beri http://support.microsoft.com/kb/948080 göre, benim geçici yavaşlık benim gösteren kuruluşumuzun etki alanı denetleyicisine iletişim kurmaya çalışıyor hem RSACryptoServiceProvider en SignData veya VerifyData yöntemleri nedeniyle olabilir, ben bir imediate başarıydı benim şirket, bir VPN bağlantısı kurmaya karar verdik.

Şimdi SHA1 karmalarını 5 saniyeye kadar beklemek yerine anında alırım.

Bunun bir çözüm olmadığını biliyorum, ancak en azından makul bir çözümdür. Ayrıca aklımızı kaybetmemizi engeller.

+1

Bu sorun vardı. Aynı Microsoft KB'yi okuduktan sonra SignData yerine SignHash'i kullandık. SignHash için giriş, daha sonra verilerin SHA1 hash değeri olması gerekiyordu. Önceden: 'RSACryptoServiceProvider csp = yeni RSACryptoServiceProvider(); byte [] result = csp.SignData (myData, yeni SHA1CryptoServiceProvider()); Şimdi: 'RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); SHA1Managed sha = new SHA1Managed(); byte [] shaHash = sha.ComputeHash (myData); byte [] sonuç = csp.SignHash (shaHash, null); ' – CleanUp