Problem mit eigener en/decrypt routine



  • Hallo,
    ich versuche gerade mir eine eigene ver-/entschlüsselungsroutine zu schreiben der quellcode compiliert auch ohne fehler aber sobald ich dann auf die decrypt funktion ( der debugger meckert mir die codezeile 77 an (der kommentar vor codezeile 77 (//cleartext = sr->ReadToEnd(); ) war der erste versuch auch da wurde an dieser Stelle das Programm unterbrochen) zugreife wird das programm angehalten und der debugger greift und ich kann leider nicht so ganz nachvollziehen wieso es da ein problem gibt.

    ich wäre euch echt dankbar wenn ihr mir da weiterhelfen könntet.

    hier mal mein code

    datei_routine.c

    #include "stdafx.h"
    #include "datei_routine.h"
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Security::Cryptography;
    using namespace System::Text;
    using namespace System::IO;
    
    datei::datei(void)
    {
    }
    
    array<Byte>^ datei::hash_string(String^ zu_hashen)
    {
    	SHA256^ shaM = gcnew SHA256Managed;
    	array<Byte> ^inArray = (gcnew UnicodeEncoding)->GetBytes(zu_hashen);
    	//String ^wandelbuffer;
    	inArray=shaM->ComputeHash(inArray);
    	//wandelbuffer=(gcnew UnicodeEncoding)->GetString(inArray);
    	//wandelbuffer=Convert::ToBase64String(inArray);
    	return inArray;
    }
    String^ datei::encrypt_string(String^ basis, String^ pw)
    {
    	UnicodeEncoding^ uc= gcnew UnicodeEncoding();
        MemoryStream^ ms = gcnew MemoryStream;
    	array<Byte>^key;
    	array<Byte>^B_IV;
    	key=hash_string(pw);
        RijndaelManaged^ rm = gcnew RijndaelManaged;
    	if (iv==L"leer")
    	{
    		erzeuge_iv();
    	}
    	B_IV=System::Convert::FromBase64String(iv);
    	CryptoStream^ cs = gcnew CryptoStream(ms, rm->CreateEncryptor(key, B_IV),CryptoStreamMode::Write);
        StreamWriter^ sw = gcnew StreamWriter(cs);
    
        try {
            sw->Write(basis);
        } finally {
            sw->Close();
            cs->Close();
            ms->Close();
        }
    
        return System::Convert::ToBase64String(ms->ToArray());
    
    }
    String^ datei::decrypt_string(String^ basis, String^ pw)
    {
    	UnicodeEncoding^ uc= gcnew UnicodeEncoding();
    	array<Byte>^key;
    	array<Byte>^B_IV;
    	array<Byte>^fromEncrypt;
    	key=hash_string(pw);
    	if (iv!=L"leer")
    	{
    		B_IV=System::Convert::FromBase64String(iv);
    		MemoryStream^ ms = gcnew MemoryStream;
    		RijndaelManaged^ rm = gcnew RijndaelManaged;
    		CryptoStream^ cs = gcnew CryptoStream(ms, rm->CreateDecryptor(key, B_IV),CryptoStreamMode::Read);
    		StreamWriter^ sw = gcnew StreamWriter(ms);
    		StreamReader^ sr = gcnew StreamReader(cs);
    	    System::String^ cleartext;
    		try 
    		{
    			array<System::Byte>^ bytes = System::Convert::FromBase64String(basis);
    			sw->Write(bytes);
    			//cleartext = sr->ReadToEnd();
    			fromEncrypt = gcnew array<Byte>(bytes->Length);
    			cs->Read(fromEncrypt, 0, fromEncrypt->Length);
    			cleartext=uc->GetString(fromEncrypt);
    		} 
    		finally	
    		{
    			sw->Close();
    			sr->Close();
    			cs->Close();
    			ms->Close();
    
    		}
    		return cleartext;
    	}
    	else
    	{
    		return L"fail";
    	}
    }
    
    bool datei::erzeuge_iv()
    {
    	RijndaelManaged^ rm = gcnew RijndaelManaged;
    	array<Byte>^IV;
    	rm->GenerateIV();
    	IV=rm->IV;
    	iv=System::Convert::ToBase64String(IV);
    
    	return true;
    }
    String^ datei::zeige_iv()
    {
    	return iv;
    }
    

    datei_routine.h

    #pragma once
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Security::Cryptography;
    using namespace System::Text;
    using namespace System::IO;
    
    public ref class datei
    {
    private:
    	static String^ iv=L"leer";
    public:
    	datei(void);
    	//beginn der funktionen
    	array<Byte>^ hash_string(String^ zu_hashen);
    	String^ encrypt_string(String^ basis, String^ pw);
    	String^ decrypt_string(String^ basis, String^ pw);
    	bool erzeuge_iv();
    	String^ zeige_iv();
    };
    

    und meine funktion in der ich dann die gewünschten aktionen durchführen möchte (momentan nur zum testen ergibt keinen Sinn!)

    System::Void Datenspeicher::Form1::testToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
    {	
    
    	datei^ d_o=gcnew datei();
    	String^ testa=L"HelloWorld";
    	String^ puffer_en;
    	String^ puffer_de;
    	String^ pw=L"test";
    	d_o->erzeuge_iv();
    	String^ iv=d_o->zeige_iv();
    	puffer_en=d_o->encrypt_string(testa,pw);
    	String^ iv_b=d_o->zeige_iv();
    	puffer_de=d_o->decrypt_string(puffer_en,pw);
    	MessageBox::Show("Generierte IV: "+iv+" encrypted String: "+puffer_en+" iv die 2.: "+iv_b+" klartext: "+puffer_de,"Datenspeicher",MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
    }
    

    Vielen Dank schon einmal im voraus.

    PS.: ich bin noch relativ unerfahren in c++



  • Was sagt denn der Debugger ?



  • http://www.lotto-wissen.de/error.JPG

    er meckert einmal wegen der iv wobei die eigentlich io ist die wird zuerst erzeugt und dann als base64 string gespeichert und dann später von der decryptroutine wieder aufgegriffen und mit

    System::Convert::FromBase64String(iv);
    

    in ein byte array umgewandelt.
    und bei cs bringt er mir eine exception.

    http://www.lotto-wissen.de/error2.JPG



  • Manch anderer hätte die exakte Fehlermeldung des Debuggers gepostet....



  • Eine nicht behandelte Ausnahme des Typs "System.IndexOutOfRangeException" ist in mscorlib.dll aufgetreten.

    Zusätzliche Informationen: Der Index war außerhalb des Arraybereichs.

    das ist alles was er mir sagt


Anmelden zum Antworten