Warum ist RsacryptoServiceProvider.encrypt () nicht stabil?
-
25-10-2019 - |
Frage
Bis heute lebte ich unter dem Eindruck, dass die RSA -Verschlüsselung mit RSA deterministisch ist. Wie sollte die Unterschriftenüberprüfung doch funktionieren, wenn dies nicht der Fall war?
Zu meiner großen Überraschung, .nets RSACryptoServiceProvider
Hat keine stabile Ausgabe, wenn Sie denselben Satz von Bytes mit denselben Schlüssel verschlüsseln:
[Fact]
public void Learning()
{
const int keySize = 1024;
System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(keySize);
var bytes = GenerateRandomDataWithLength( 36 );
for (int i = 0; i < 4; i++)
Assert.Equal( rsa.Encrypt( bytes, false ), rsa.Encrypt( bytes, false ) );
}
byte[] GenerateRandomDataWithLength( int length )
{
Random r = new Random();
byte[] data = new byte[length];
r.NextBytes( data );
return data;
}
Ich habe durch das überschleudert PKCS -Spezifikation Und ich verstehe die Mathematik hinter RSA, also frage ich mich wirklich, warum ich die Ausgabe als instabil beobachte.
Die RSA -Implementierung von Mono hat eine stabile Ausgabe. Der instabile Ausgang von Encrypt
Beeinträchtigt keinen Einfluss auf die Entschlüsselung, was gut möglich ist und die erwarteten Daten ergibt.
Lösung
Die RSA -Verschlüsselung ist rein mathematisch, sodass Sie jedes Mal das gleiche Ergebnis erzielen. Jedoch rufen Encrypt
In .NET führt nicht einfach die RSA -Verschlüsselung durch.
Wieso den ? Die PKCS#1 Polsterung (Standard bei Verwendung false
in Encrypt
) wird jedes verschlüsselte Ergebnis unterschiedlich machen, da es zufällige Daten enthält (für Polsterzwecke).
Mono hat das gleich Verhalten (zumindest in meinem System siehe Anmerkung). Wenn Sie jedoch verwenden EncryptValue
, welches Mono unterstützt, aber .net nicht (Kryptoapi -Einschränkung), dann nein Die Polsterung erfolgt und das verschlüsselte Ergebnis wird jedes Mal identisch sein.
Notiz: Wenn Sie unterschiedliche Ergebnisse haben http://bugzilla.xamarin.com und fügen Sie die Versionsnummer hinzu, die Sie verwenden.