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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top