Passwörter Entschlüsseln Rijndael


Hallo Leute,
mein Lehrer hat ein Programm in Java erstellt womit er Passwörter verschlüsseln kann.
Jetzt sollen wir in C# ein eigenes Programm erstellen was die Passwörter entschlüsselt.
Also ich kopiere den Verschlüsselten Text in meine Textbox und drücke auf entschlüsseln und raus soll der entschlüsselte Wert kommen in dem Fall Test.

Man gibt den Key und den Text den man verschlüsseln möchte in einer Textbox ein.

Key: 1234567890123450
Keylength: 16
Hash Class: SHA1
Cipher Class: Rijndael = AES
Text: Test
Text Crypt: TWFF7r1zuGLriL4fQ/gI5gWDRBvYxvpcTiVFvEuEsU7bErvGtSdNug==
Text Encrypt: Test

Der Modus ist CBC und es wird base64 benutzt

Kann mir jemand sagen wie ich das umsetzen soll ?
Hat vielleicht jemand ein Code für mich?

LG,
Move
 

sheel

I love Asm
Nachdem du den Key durch den Benutzer erhalten hast (oder sonst was)
übergibst du ihn als ersten Parameter an RijndaelManaged::CreateEncryptor
(die Existenz des Objekts vorausgesetzt)
Der Beispielcode zeigt eigentlich alles, was man braucht.
 
Key: 1234567890123450
Keylength: 16
Hash Class: SHA1 <----------
Cipher Class: Rijndael = AES
Text: Test
Text Crypt: TWFF7r1zuGLriL4fQ/gI5gWDRBvYxvpcTiVFvEuEsU7bErvGtSdNug==
Text Encrypt: Test
 

sheel

I love Asm
Wie schon bei deinen zwei vorigen Aufgaben hat der Lehrer wohl einfach alle Algorithmen, die er über das Ganze Jahr verwendet, in die Angabe reingeklatscht, auch wenn sie für die eine Aufgabe gar nicht relevant sind.
(und dafür vermutlich wichtige andere Infos weggelassen.)

SHA1 ist hier sehr sicher komplett egal.
 
Zuletzt bearbeitet:
Hallo Leute,
ich habe eine Form erstellt womit man Texte verschlüsseln kann.
Das Verschlüsseln klappt aber bei der Entschlüsselung bekomme ich eine FormatException.
Code:
System.FormatException wurde nicht behandelt.
  HResult=-2146233033
  Message=Ungültige Länge für Base-64-Zeichenarray oder -Zeichenfolge.
  Source=mscorlib
  StackTrace:
       bei System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength)
       bei System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
       bei System.Convert.FromBase64String(String s)
       bei RijndaelSHA.Form1.Entschlüsseln(String CipherText) in Form1.cs:Zeile 128.
       bei RijndaelSHA.Form1.btnEntschlüsseln_Click(Object sender, EventArgs e) in Form1.cs:Zeile 34.
       bei System.Windows.Forms.Control.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
       bei System.Windows.Forms.Button.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.Run(Form mainForm)
       bei RijndaelSHA.Program.Main() in Program.cs:Zeile 19.
       bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()
  InnerException:
Folgende Komponenten benutze ich.
1 Textbox(Text der Verschlüsselt werden soll)
1 Textbox(Salt)
1 Textbox(Verschlüsselte Text)
1 Button(Verschlüsseln)
1 Button(Entschlüsseln)


C#-Code:
C#:
private void btnVerschluesseln_Click(object sender, EventArgs e)
         {
             key = Convert.ToString(txtkey.Text);
             EnValue = Convert.ToString(txttext.Text);
             txtcrypt.Text = Verschlüsseln(key);
        }

        private void btnEntschluesseln_Click(object sender, EventArgs e)
        {
            EnValue = Convert.ToString(txtcrypt.Text);
            key = Convert.ToString(txtkey.Text);
            txttext.Text = Entschluesseln(key);
        }

public string Verschluesseln(string Text)
        {
            string passPhrase = txttext.Text;   //   "text"
            string saltValue = txtkey.Text;     //   "Zufällig gewählte Zeichenfolge"
            string hashAlgorithm = "SHA1"; // Hash Klasse

            int passwordIterations = 2;
            string initVector = "n82r3n834r834911";   //  "bezeichnet einen Block von Zufallsdaten"
            int keySize = 256;

            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            byte[] plainTextBytes = Encoding.UTF8.GetBytes(Text);

            PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

            RijndaelManaged aes = new RijndaelManaged();
            byte[] keyBytes = password.GetBytes(keySize / 8);

            aes.Mode = CipherMode.CBC;

            ICryptoTransform encryptor = aes.CreateEncryptor(keyBytes, initVectorBytes);

            MemoryStream memoryStream = new MemoryStream();
            {
                CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                byte[] cipherTextBytes = memoryStream.ToArray();

                using (StreamWriter swEncrypt = new StreamWriter(memoryStream))
                {
                    swEncrypt.Write(Text);
                }
            }

            string cipherText = Convert.ToBase64String(memoryStream.ToArray());
            return cipherText;
        }

public string Entschluesseln(string CipherText)
        {
            string passPhrase = null;   //   "Text"
            string saltValue = txtkey.Text;     //   "Zufällig gewählte Zeichenfolge"
            string hashAlgorithm = "SHA1";

            int passwordIterations = 2;
            string initVector = "n82r3n834r834911";   //  "bezeichnet einen Block von Zufallsdaten"
            int keySize = 256;

            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector); //Formatiert den initVektor zu Bytes
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
//Formatiert den Salzwert zu Bytes
            byte[] cipherTextBytes = Convert.FromBase64String(CipherText); // Hier kommt die Exception 

            PasswordDeriveBytes key = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, passwordIterations);

            byte[] keyBytes = key.GetBytes(keySize / 8);

            RijndaelManaged symmetricKey = new RijndaelManaged();

            symmetricKey.Mode = CipherMode.CBC;
            ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes);

            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

            CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);

            byte[] plainTextBytes = new byte[cipherTextBytes.Length];

            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

            string plainText = Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);

            return plainText;
        }
Wieso ist das Zeichenarray ungültig ?
Ich glaube ich habe tomaten auf den Augen :confused:
 
Zuletzt bearbeitet von einem Moderator:

sheel

I love Asm
Da das die Fortsetzung zu deinem vorigen Thema ist hab ich den Beitrag auch dort hingeschoben.
(Die Infos im alten Teil sind wichtig für die Antwort, also...)

Was ist denn CipherText bei deinen Eingaben zB.?
 

sheel

I love Asm
Diverse Sachen beim Code, da ist nämlich ein großes Durcheinander:

Klickhandler:
Convert.ToString sollte unnötig sein.

Wozu die beiden Werte abfragen, wenn man sowieso nur einen verwendet?

Und du übergibst den key als "Text". Der eigentliche Text wird eben nicht übergeben.

Verschlüsselungsmethode:

Hier sollten die Textfelder nicht mehr verwendet werden; ist ja schon in den
Klickhandlern passiert. Dafür gibts Parameter.

Die Variablennamen sind irreführend. Text ist der Key, passPhrase ist der Text,
und saltValue ist auch der Key. Passwort, Salt und Iterationsanzahl gibt es in
der Aufgabe außerdem nirgends, also wozu ist das da?
Später im Code verwechselst du die Variablen dann selber
(zB. plainTextBytes wird aus dem Keytextfeld gemacht)

Entscheide dich für ASCII oder UTF8. Nicht beides.

Ein Hash als Key ist eventuell nicht das Gewünschte.
Bin noch immer der Meinung, das nichts auf SHA1 vermuten lässt, weg damit.

Irgendwie beschreibst du den MemoryStream unten zweimal. Wozu?

Base64 wird bei dir nicht auf cipherTextBytes angewendet, sondern auf den Stream.


Fast alles davon trifft auch auf die Entschlüsselfunktion zu.
So kann das nicht funktionieren.
 
Zuletzt bearbeitet:

Neue Beiträge