Unicode Zeichensatz nutzen (siehe unten)



  • Der folgende Code ist ein sehr simples, aber effektives (zeitlich) Verschlüsselungsverfahren.
    Sobald aber der zu verschlüsselnde "Text" zu groß wird (Datei), beginnt er mir immer zu sagen "" sei kein gültiger integer. Ich kann mir das nur erklären, dass Zeichen fehlen, wo kann ich nicht sagen.

    #include <vcl.h>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    
    class CX4Verschlüsselung
    {
    	public:
    		String Encrypt(String Text, String Schlüssel);
    		String Decrypt(String Text, String Schlüssel);
    };
    
    String CX4Verschlüsselung::Encrypt(String Text, String Schlüssel)
    {
    	int i = 0;
    	std::vector <int> Save;
    	String Result;
    	std::ofstream SaveKey;
    	std::ofstream SaveResult;
    	SaveKey.open(Schlüssel.c_str(), ios::binary);
    	SaveResult.open((Schlüssel + " Result").c_str(), ios::binary);
    	while (i < Text.Length())
    	{
    		i++;
    		unsigned char Zeichen = Text[i];
    		int Zahl = int(Zeichen);
    		int neu = 0;
    		if (Zahl%2 == 1)
    		{
    			neu = Zahl + 1;
    			int Rand = rand()%(256-Zahl);
    			Save.push_back(Rand);
    			neu = neu + Rand;
    			Result += IntToStr(neu);
    			Result += "ea";
    			SaveKey << IntToStr(Save[i-1]).c_str() << "ea" << "\n";
    			SaveResult << IntToStr(neu).c_str() << "ea" << "\n";
    		}
    		else
    		{
    			neu = Zahl;
    			int Rand = rand()%(256-Zahl);
    			Save.push_back(Rand);
    			neu = neu + Rand;
    			Result += IntToStr(neu);
    			Result += "eo";
    			SaveKey << IntToStr(Save[i-1]).c_str() << "eo" << "\n";
    			SaveResult << IntToStr(neu).c_str() << "eo" << "\n";
    		}
    	}
    	SaveKey.close();
    	SaveResult.close();
    	return Result;
    }
    
    String CX4Verschlüsselung::Decrypt(String Text, String Schlüssel)
    {
    	int i = 0;
    	std::ifstream Read;
    	Read.open(Schlüssel.c_str(), ios::binary);
    	std::string line;
    	std::vector <std::string> Code;
    	std::vector <std::string> Availables;
    	int Size = 0;
    	if (Read)
    	{
    		while (std::getline(Read,line))
    		{
    			Size++;
    			int a = 0;
    			String LineStr;
    			while (a < line.size())
    			{
    				a++;
    				if (line[a-1] != 'e')
    					LineStr += line[a-1];
    				else
    					break;
                }
    			Code.push_back(LineStr.c_str());
    		}
    		Read.close();
    		int begin = 0, len = 0;
    		String Zahl;
    		ShowMessage("GotIt");
    		bool firstpush = true;
    		try
    		{
    			while (i < Text.Length())
    			{
    				i++;
    				if (Text.SubString(i-1,1) != "e" && Text.SubString(i-1,1) != "o" && Text.SubString(i-1,1) != "a")
    				{
    					len = i - begin;
    					Zahl = Text.SubString(begin,len);
    				}
    				else
    				{
    					if (firstpush)
    					{
    						Zahl = Zahl.SubString(0,Zahl.Length()-1);
    					}
    					firstpush = false;
    					i += 1;
    					begin = (i);
    					if (Text.SubString(i-1,1) == "o")
    						Zahl = IntToStr(StrToInt(Zahl) + 1);
    					Zahl = IntToStr(StrToInt(Zahl) - 1);
    					Availables.push_back(Zahl.c_str());
    				}
    			}
    		}
    		catch(...)
    		{
                ShowMessage("Fehler geortet");
            }
    		i = 0;
    		String Ret;
    		while (i < Size)
    		{
    			i++;
    			std::string CH;
    			int New = (StrToInt(Availables[i-1].c_str())-StrToInt(Code[i-1].c_str()));
                CH = static_cast<unsigned char> (New);
    			Ret += CH.c_str();
    		}
    		return Ret;
    	}
    	return "Fehler";
    }
    

    Aufruf:

    void __fastcall TCodeX4::Button1Click(TObject *Sender)
    {
    	CX4Verschlüsselung* CX4 = new CX4Verschlüsselung;
    	String Schlüssel = ModuleInformation("Appi",1).c_str();
    	Schlüssel += "Schlüssel\\Code X4\\";
    	Schlüssel += KeyName->Text;
    	Schlüssel += "\\";
    	Schlüssel += KeyName->Text;
    	Schlüssel += ".cx4";
    
    	CreateDirectory(Schlüssel.SubString(0,Schlüssel.Length()-4-KeyName->Text.Length()).c_str(),NULL);
    
    	Ausgang->Text = CX4->Encrypt(Eingang->Text,Schlüssel);
    	delete CX4;
    }
    //---------------------------------------------------------------------------
    void __fastcall TCodeX4::FormHide(TObject *Sender)
    {
    	Main->Show();
    }
    //---------------------------------------------------------------------------
    void __fastcall TCodeX4::Button2Click(TObject *Sender)
    {
    	CX4Verschlüsselung* CX4 = new CX4Verschlüsselung;
    	String Schlüssel = ModuleInformation("Appi",1).c_str();
    	Schlüssel += "Schlüssel\\Code X4\\";
    	Schlüssel += KeyName->Text;
    	Schlüssel += "\\";
    	Schlüssel += KeyName->Text;
    	Schlüssel += ".cx4";
    
    	Ausgang->Text = CX4->Decrypt(Eingang->Text,Schlüssel);
    	delete CX4;
    }
    //---------------------------------------------------------------------------
    

    Ich sehe absolut kein Systematischen Fehler.

    EDIT: Jupp wenn ich den inhalt in einer Datei speicher (Eingang->SaveToFile) dann sind das exakt 64,1 KB rund 65. der schlüssel ist 261 KB groß. eine kleine Abweichung darf / kann sein aber das ist 100 % eine Grenze des RichEdits.
    Soll ich Dateien Seperat verschlüsseln lassen ? Oder irre mich ja.



  • Hallo

    Ja, das normale TRichEdit hat von Windows aus eine Maximalgrenze von 64 KByte Zeichen. Hier findest du einen Weg, wie du diese Grenze erhöhen kannst.

    bis bald
    akari



  • Danke funktioniert so, aber das ist möglicherweise sowieso egal, weil meine Zeichenbandbreite von 0 bis 255 sowieso nicht für Dateien reicht.
    Was ich da machen soll weiß ich noch nicht.

    Kann ich Unicode benutzen ?, das reicht auf alle fälle aus (glaub ich), ASCII nicht.
    Doch weiß ich nicht wie ich aus einem Zeichen eine Zahl mache und umgekehrt



  • Hallo

    Danke funktioniert so, aber das ist möglicherweise sowieso egal, weil meine Zeichenbandbreite von 0 bis 255 sowieso nicht für Dateien reicht.
    Was ich da machen soll weiß ich noch nicht.

    Kann ich Unicode benutzen ?, das reicht auf alle fälle aus (glaub ich), ASCII nicht.
    Doch weiß ich nicht wie ich aus einem Zeichen eine Zahl mache und umgekehrt

    Wenn du eine Unicode-Textdatei hast, dann solltest du wenigstens zum Anzeigen auch Unicode-kompatible Controls benutzen.
    Wenn du aber binäre Dateien hast, dann nützt dir UnicodeString genausowenig wie AnsiString, diese Dateien solltest du nicht mit String-Klassen oder TStringList behandeln, sondern nur durch Streams (TFileStreams oder std::fstream) sowie char/w_char_t-Arrays.

    Ein char/w_char_t must du nicht extra in eine Zahl umwandeln, diese Datentypen sind selber schon Zahlen.

    bis bald
    akari



  • Hallo

    Die Diskussion um die Effektivität des Verschlüsselungsverfahrens wird hier fortgesetzt.

    bis bald
    akari


Log in to reply