Hallo,
ich brauche eine asymmetrische Verschlüsselung in C#.
D.h. ich will mit zwei Schlüsseln arbeiten, aber das ganze umgekehrt.
Zum Entschlüsseln will ich einen öffentlichen schlüssel verwenden und zum Verschlüsseln einen privaten schlüssel.
Mit dem RSA komme ich nicht weiter, da der private Schlüssel (zum Entschlüsseln) gleichzeitig auch den öffentlichen Schlüssel enthält.
Hat jemand eine Idee wie man es lösen könnte?
Danke
Steffen
Du kannst RSA nehmen.
Du verschlüsselst mit dem privaten RSA-Schlüssel und kannst dann mit dem öffentlichen RSA Schlüssel entschlüsseln.
Die Reihenfolge, in der du die Schlüssel anwendest kannst du nämlich vertauschen.
Darauf basiert auch das Signieren von Nachrichten (RSA).
beste Grüße
zommi
Hallo zoomi,
danke für den Hinweis,
mit den .net-mitteln klappt es nicht.
ich erhalte beim entschlüsseln dann eine Exception:
{System.Security.Cryptography.CryptographicException: Fehler beim Decodieren von OAEP-Padding.
bei System.Security.Cryptography.Utils._DecryptPKWin2KEnh(SafeKeyHandle hPubKey, Byte[] key, Boolean fOAEP, Int32& hr)
bei System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)
bei ...
bei ...}
und wenn ich ohne OAEP verschlüssel und entschlüssel, kommt beim entschlüsseln "ungültiger schlüssel" als fehlermeldung...
hier ein bisschen Code:
string RSAVerschluesseln(string sText, string sKey)
{
// Die zu verschlüsselnden Daten als Byte-Array definieren
byte[] symmetricEncryptionKey = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(sText);
// RSA-Instanz erzeugen und den öffentlichen Schlüssel zuweisen
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(sKey);
// Mit OAEP-Padding verschlüsseln
byte[] encryptedData = rsa.Encrypt(symmetricEncryptionKey, true);
// Die verschlüsselten Daten als ISO-8859-1-String darstellen
return Encoding.GetEncoding("ISO-8859-1").GetString(encryptedData);
}
string RSAEntschluesseln(string sText, string sKey)
{
// Die verschlüsselten Daten aus dem String ermitteln
byte[] encryptedData = Encoding.GetEncoding("ISO-8859-1").GetBytes(sText);
// RSA-Instanz erzeugen und mit dem XML-Schlüssel initialisieren
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(sKey);
// Entschlüsseln
byte[] decryptedData = rsa.Decrypt(encryptedData, true);
return System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(decryptedData);
}
der Aufruf:
// Instanz der Klasse für den Verschlüsselungs-Algorithmus erzeugen
AsymmetricAlgorithm asymmetricAlgorithm = RSA.Create();
// Die Schlüsselgröße bestimmen
asymmetricAlgorithm.KeySize = 2048;
// XML-String für den öffentlichen Schlüssel erzeugen
string publicKeyXml = asymmetricAlgorithm.ToXmlString(false);
// XML-String für den privaten und öffentlichen Schlüssel erzeugen
string privateAndPublicKeyXml = asymmetricAlgorithm.ToXmlString(true);
try
{
string sVerschluesselt = RSAVerschluesseln("Dies ist ein Test", privateAndPublicKeyXml);
string sEntschluesselt = RSAEntschluesseln(sVerschluesselt,
publicKeyXml);
}
catch (System.Exception ex)
{
}
Wenn der Schlüssel zum Entschlüsseln öffentlich ist, kann doch jeder mit ihm die Daten entschlüsseln.
Wenn jeder die daten sowieso lesen kann, kann man sie auch gleich unverschlüsselt veröffentlichen und DSA signieren, um Manipulation und Fälschung vorzubeugen.
Wenn nur gewollt ist, dass man einen Schlüssel braucht zum entschlüsseln, kann man genausogut ein symmetrisches Verfahren einsetzen.
Wenn man also ein symmetrisches Verfahren (Mars,Twofish,AES,...) mit einer Digitalen signatur kombiniert, kommt das aufs gleiche raus und ist höchstwahrscheinlich sogar performanter, als die gesamte Nachricht komplett mit RSA zu verschlüsseln.
Hallo Steffen, hallo Floste,
wenn man mit einem geheimen Schlüssel verschlüsselt, so dass es jeder mit dem öffentlichen Schlüssel entschlüsseln kann dann ist das per Definition "digitale Signierung".
Ist genau das gleiche Prinzip.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Geht nur über einen eigenen Provider Public Key RSA Encryption in C# .NET
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...