Laden...

Asymmetrische Verschlüsselung: Mit privatem Schlüssel verschlüsseln, mit öffentlichem entschlüsseln

Erstellt von steffen_dec vor 14 Jahren Letzter Beitrag vor 13 Jahren 8.091 Views
S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 14 Jahren
Asymmetrische Verschlüsselung: Mit privatem Schlüssel verschlüsseln, mit öffentlichem entschlüsseln

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

1.361 Beiträge seit 2007
vor 14 Jahren

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

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 14 Jahren

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)
            {
            	
            }

T
381 Beiträge seit 2009
vor 13 Jahren

Problem gelöst? Ich sitze gerade am selben Problem.

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 13 Jahren

Hallo Tarion,

nee leider nicht

Gruß
Steffen

1.130 Beiträge seit 2007
vor 13 Jahren

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.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

3.825 Beiträge seit 2006
vor 13 Jahren

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

1.130 Beiträge seit 2007
vor 13 Jahren

bei dsa wird aber nicht die nachricht ansich, sondern deren hash verschlüsselt

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

3.971 Beiträge seit 2006
vor 13 Jahren

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...