2010-11-23 3 views
9

Je travaille actuellement sur une simple signature de données. C'est la première fois que j'utilise la signature, alors peut-être que je fais quelque chose de mal. Mais je ne pense pas qu'il soit normal que cela prenne 4,6 secondes pour signer 448 octets en utilisant un hachage RSA et SHA1 de 512 bits.Vitesse de signature avec RSACryptoServiceProvider

Le code:

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 

Pourquoi est-ce que lent? J'ai trouvé ceci: http://support.microsoft.com/kb/948080, mais c'est un problème de .NET 2.0. J'utilise 4.0.

Est-il normal que cela dure si longtemps ou y a-t-il une erreur?

Merci pour toute aide.

+1

D'où obtenez-vous 'KeyString'? –

+0

Sur ma machine virtuelle exécutant un invité Win XP sur un hôte Mac OS X, la signature ne prend pas beaucoup de temps. Soit 'Data' est de taille mégaoctets ou' KeyString' représente une énorme clé RSA ou les deux. –

+0

KeyString est une chaîne que je suis sorti d'un RSACryptoProvider avant. C'est juste une clé de 512 bits en codage Base64. Et les données sont définitivement seulement des octets. C'est juste une courte chaîne. – Marks

Répondre

-2

Une partie de la raison pour laquelle les opérations de chiffrement mettent du temps à s'exécuter est que vous ne voulez pas que les personnes soient capables de forcer votre algorithme. Quel est votre cas d'utilisation pour la signature de vos données? A-t-il besoin d'être rapide? Est-ce une vérification simple pour s'assurer que les données sont valides ou avez-vous besoin d'être cryptées?

Si vous êtes sérieux au sujet de cryptage que vous pouvez vérifier les choses du château plein d'entrain:

http://www.bouncycastle.org/

+4

Pas particulier pertinent à la question parce que la réponse est non, il ne devrait pas prendre autant de temps à signer 448 octets de données. –

0

Couple de points:

1) J'ai aussi trouvé un débit plus élevé en appelant SHA1 algorithme de hachage directement, puis en passant qui a dans la méthode SignHash() au lieu de la méthode SignData(). Je ne sais pas si c'est un problème d'implémentation dans la méthode SignData() mais cela semble être mon expérience.

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

2) Si vous voulez le faire en un seul appel de méthode empêche la nécessité de cadre pour faire une recherche (lorsque vous passez la chaîne « SHA1 ») car il est cher et peut contribuer au retard Essayez d'utiliser les éléments suivants à la place:

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

Juste pour vous faire savoir que j'EPROUVE cette même lenteur obtenir SHA1 signé hash. Le code qui signait généralement des dizaines sur des centaines de transactions par seconde, soudainement, ralentissait à 1 toutes les 5 secondes.

Je travaillais à la maison et je n'étais pas connecté au réseau de mon entreprise. Après quelques recherches sur Google, j'ai réussi à repérer le coupable. Un bug semble affecter RSACryptoServiceProvider sur .Net Framework 2.0 - ce que je crois EXACTEMENT le même code utilisé sur .Net Framework 4.0.

Depuis, selon http://support.microsoft.com/kb/948080, ma lenteur temporaire peut être due méthodes SignData ou verifydata des deux RSACryptoServiceProvider essayant de communiquer au contrôleur de domaine de mes Companys, j'ai décidé d'établir une connexion VPN à mon entreprise, qui a été un succès imediate.

Maintenant, je reçois instantanément les hachages SHA1, au lieu d'attendre jusqu'à 5 secondes.

Je sais que ce n'est pas une solution, mais, au moins, est une solution de contournement raisonnable. Cela nous empêche également de perdre notre santé mentale.

+1

Avait ce problème. Après avoir lu le même KB de Microsoft, nous avons utilisé SignHash au lieu de SignData. Entrée pour SignHash alors juste nécessaire d'être la valeur de hachage SHA1 des données. Auparavant: 'RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); byte [] result = csp.SignData (myData, nouveau SHA1CryptoServiceProvider()); ' maintenant: ' RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); SHA1Managed sha = new SHA1Managed(); octet [] shaHash = sha.ComputeHash (myData); byte [] resultat = csp.SignHash (shaHash, null); ' – CleanUp

Questions connexes