Erstens habe ich den folgenden Code nur für akademische Zwecke geschrieben. Der Grund, warum ich dies sage, ist, dass ich dies nicht in eine Produktionsumgebung setze und deshalb einen Teil des Overheads "umgehe", was ich tun müsste, wenn ich in der Lage wäre, eine Zeichenkette zu verschlüsseln / entschlüsseln der Code unten. Ich konnte es ein paar Mal tun, aber aus irgendeinem Grund erhielt ich "CryptographicException Bad Data" und bin mir nicht sicher, was das Problem verursachen könnte.
%Vor%Diese Ausnahme wird nur beim RSADecrypt-Aufruf ausgelöst.
Irgendwelche Ideen? Ich habe irgendwo gelesen, dass es möglicherweise mit der erwarteten Größe von verschlüsselten Daten, die in RSA.Decrypt übergeben wird, zu tun hat.
Danke }
Konvertieren Sie den Klartext unter Verwendung einer String-Codierung (d. h. Encoding.Unicode
).
Konvertieren Sie die verschlüsselten Daten mit Base-64 (d. h. Convert.[To/From]Base64String
);
So:
%Vor%Roundtrip-Chiffretext nicht über eine String-Codierung
Ein häufiger Fehler, den Benutzer bei der Verwendung von verwalteter Verschlüsselung machen Klassen ist, dass sie versuchen, das Ergebnis einer Verschlüsselung zu speichern Operation in einem String mit einer der Encoding-Klassen. Das scheint Sinn zu machen, oder? Immerhin dauert Encoding.ToString () a byte [] und konvertiert es in eine Zeichenfolge, die genau das ist, was sie waren suchen.
...
Wenn Sie den Chiffretext in eine Zeichenfolge konvertieren möchten, verwenden Sie stattdessen Base64-Codierung.
...
Ergebnisse in Code, der jedes Mal funktioniert, seit Base 64 codiert ist garantiert in der Lage zu sein, irgendeine Eingangsbyte-Sequenz genau darzustellen.
Hier gibt es ein gutes, korrektes Beispiel: Ссылка
RSA soll keine großen Objekte verschlüsseln. Sie erhalten Ausnahmen, wenn Sie das Padding-Limit überschreiten. Das tatsächliche Limit basiert auf der Auffüllung selbst (die Verwendung von false
bedeutet, dass Sie die alte PKCS # 1 v1.5 Auffüllung verwenden) und die Länge Ihres öffentlichen Schlüssels (2048 Bit).
Der richtige Weg, RSA
mit einem großen Objekt zu verwenden, besteht darin, das große Objekt mit einem symmetrischen Schlüssel zu verschlüsseln (z. B. einen 256 Bit AES
geheimen Schlüssel) und diesen kleinen Schlüssel zu verschlüsseln RSA
öffentlicher Schlüssel.
Sie finden Code, um solche Dinge auf meinem Blog zu tun.
Tags und Links c# cryptography encryption rsa