Verschluesselung funktioniert nicht

Alles rund um die Programmierung mit Qt
Antworten
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Verschluesselung funktioniert nicht

Beitrag von Irods »

Hi Leute,
also ich versuche eine Verschluesselung zu realisieren.
Das Problem ist das in manchen Fällen toll funktioniert und in manchen Muell raushaut.

dier mal der code zur verschluesselung

Code: Alles auswählen

QString KryptEnt::encrypt(QString qbegin, QString qpw )
{
	if(qpw.size()<20)
	{
		QMessageBox::information( this, "Password Error", "The Password is to short(min. 20 chars)!", QMessageBox::Ok );
		return "failed";
	}

	std::string out;
	std::string begin = qbegin.toStdString();
	std::string pw = qpw.toStdString();
	out = (  myxor( qbegin.left(qpw.size()), qpw )  ).toStdString();

	unsigned int i = pw.size();
	while(i<begin.size())//-1
	{
		out += ( (begin[i])^(begin[i-pw.size()]) );
		i++;
	}

	QString qout = QString::fromStdString(out);
	return qout;
}
der code zur entschluesselung

Code: Alles auswählen

QString KryptEnt::decrypt(QString qbegin, QString qpw)
{
	std::string out;
	std::string begin = qbegin.toStdString();
	std::string pw = qpw.toStdString();
	out = (  myxor( qbegin.left(qpw.size()), qpw )  ).toStdString();

	unsigned int i = pw.size();
	while(i<begin.size())//-1
	{
		out += ( (begin[i])^(out[i-pw.size()]) );
		i++;
	}

	QString qout = QString::fromStdString(out);
	return qout;
}
und dir die funktion myxor

Code: Alles auswählen

QString KryptEnt::myxor(QString a, QString b)
{
	std::string stda = a.toStdString();
	std::string stdb = b.toStdString();

	int i = 1;
	while(i<=a.size())
	{
		stda[i-1] = stda[i-1]^stdb[i-1];
		i++;		
	}

	QString qsa = QString::fromStdString(stda);
	return qsa;
}
ich hab keine ahung was da nicht stimmt.

bitte um hilfe

schon ma thx und gruss irods
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und was sagt dein Debugger dazu?
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

upsala hat geschrieben:Und was sagt dein Debugger dazu?
also das programm läuft ja nur das es manchmal wenn ich zum testen was verschlüssel und dann wieder entschlüssel es nicht mehr das ist was ich zu anfang verschluesselt hab.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Junge, Junge, Junge.....Pass auf: Ich habe dir vor noch nicht mal einer Woche erklärt wie einfach man einen QString dazu bringen kann ein XOR anzunehmen. Und jetzt bietest du uns sowas an? Es ist der größte Schwachsinn, mit stdstrings zu arbeiten, wenn du so oder so QStrings annimmst und ausgibst. Vielleicht schaust du dir mal den Code an, den ich in deinem letzten Thread am Mittwoch geschrieben habe.

Ganz nebenbei bemerkt ist der code für ent- und verschlüsselung gleich, warum machst du ihn also nicht in eine funktion? Scheint so als hättest du dich noch nicht wirklich damit beschäftigt wie eine xor-verschlüsselung funktioniert.....

Mfg androphinx
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

nein wenn du dir das durch gelesen hättest dann wuerdest du sehn das es in diesem fall nicht die gleiche funktion sein kein -.-
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Ehrlich: Außer deiner Überprüfung der Passwortlänge sehe ich absolut keinen unterschied und die kannst du auch schon machen, bevor du die funktion aufrufst...
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

das hier ist der entscheidende unterschied:

Code: Alles auswählen

out += ( (begin[i])^(out[i-pw.size()]) );

Code: Alles auswählen

out += ( (begin[i])^(begin[i-pw.size()]) );
die nachricht verschluesselt sich mit sich selbst bis auf den anfang der
vom pw verschluesselt wird.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

ok, dat hab ich übersehen. erklärt aber immer noch nicht, warum du keine QStrings nutzt nur mal so ein anfang:

Code: Alles auswählen

QString out;

for(int i=0; i < pw.length(); i++)
{
  QChar c = QChar(text.at(i).toAscii() ^ pw.at(i).toAscii());
  out.append(c);
}

for(int i = pw.length(); i < text.length(); i++)
{
  QChar c = QChar(text.at(i).toAscii() ^ out.at(i - 1).toAscii());
}
Dieser Code sollte auch in beide richtungen funktionieren....
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

danke für deinen Ansatz ich hab mal folgendes draus gemacht:

Code: Alles auswählen

QString KryptEnt::encrypt(QString begin, QString pw )

{

	if(pw.size()<20)

	{

		QMessageBox::information( this, "Password Error", "The Password is to short(min. 20 chars)!", QMessageBox::Ok );

		return "failed";

	}
	if(begin.size()<pw.size())

	{
		QString msg = QString("The text is to short(min. %1 chars)!").arg( QString::number(pw.size()) );

		QMessageBox::information( this,"Text Error", msg, QMessageBox::Ok );

		return "failed";

	}



	QString out;

	for(int i=0; i < pw.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ pw.at(i).toAscii());
		out.append(c);
	}

	for(int i = pw.size(); i < begin.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ begin.at(i - pw.size()).toAscii());
		out.append(c);
	}


	return out;

}



QString KryptEnt::decrypt(QString begin, QString pw)

{

	QString out;

	for(int i=0; i < pw.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ pw.at(i).toAscii());
		out.append(c);
	}

	for(int i = pw.size(); i < begin.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ out.at(i - pw.size()).toAscii());
		out.append(c);
	}


	return out;

}
das problem ist das der gleiche fehler auftritt wie vorher
aber ich glaube das es an der art und weise meiner ausgabe
liegen koennte das der fehler aufzutreten scheint
weil ich benutze zur eingabe und zur ausgabe 2 QTextEdit die vll nicht alle zeichen richtig darstellen koennen

Wen es interressiert hier mein ganzes Programm(natuerlich nur ein test programm)

Code: Alles auswählen

//main.cpp
#include <QApplication>

#include "KryptEnt.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	KryptEnt* window = new KryptEnt;

	window->show();

	return app.exec();
}

Code: Alles auswählen

//KryptEnt.h
#ifndef KRYPTENT_H

#define KRYPTENT_H

#include <QtGui>



class KryptEnt : public QWidget

{

	Q_OBJECT

	public:

		KryptEnt( QWidget *parent = 0 );
		QString encrypt(QString , QString );
		QString decrypt(QString , QString );


                QLineEdit* pw;

                QTextEdit* text;

                QTextEdit *ausgabe;

                QPushButton *krypt;
                QPushButton *entkrypt;
        private slots:
		void kryptn();
		void entkryptn();

};

#endif

Code: Alles auswählen

#include "KryptEnt.h"

#include <QString>

#include <QMessageBox>



KryptEnt::KryptEnt( QWidget *parent): QWidget(parent)

{

        QVBoxLayout *layout = new QVBoxLayout;

        QHBoxLayout *ltext = new QHBoxLayout;

        QVBoxLayout *lausgabe = new QVBoxLayout;

        QVBoxLayout *lpw = new QVBoxLayout;

        QVBoxLayout *but = new QVBoxLayout;



        pw = new QLineEdit;

	pw->setText("00000000000000000000");



        text = new QTextEdit;

	text->setText("0123456789ABCFGHIJKLMNOPQRSTUVWXYZ0123456789ABCFGHIJKLMNOPQRSTUVWXYZ");



        ausgabe = new QTextEdit;



	ausgabe->setLineWrapMode(QTextEdit::WidgetWidth);

	ausgabe->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);

        pw->setEchoMode(QLineEdit::Password);



        krypt = new QPushButton("encrypt->");

        entkrypt = new QPushButton("decrypt->");

        but->addWidget(krypt);

        but->addWidget(entkrypt);



        QGroupBox *methods = new QGroupBox(tr("Methods"));

        methods->setLayout(but);



        ltext->addWidget(text);

        ltext->addWidget(methods);



        lpw->addWidget(pw);

        lausgabe->addWidget(ausgabe);



        QGroupBox *gpw = new QGroupBox(tr("Please enter Password:"));

        QGroupBox *gtext = new QGroupBox(tr("Enter text to encrypt/decrypt:"));

        QGroupBox *gausgabe = new QGroupBox(tr("Encrypt/Decrypt text:"));



        gpw->setLayout(lpw);

        gtext->setLayout(ltext);

        gausgabe->setLayout(lausgabe);



        layout->addWidget(gpw);

        layout->addWidget(gtext);

        layout->addWidget(gausgabe);



	connect( krypt, SIGNAL(clicked()), this, SLOT(kryptn()) );

	connect( entkrypt, SIGNAL(clicked()), this, SLOT(entkryptn()) );



	setLayout(layout);

        setWindowTitle("EntKrypt");

}

//********************main-funktions*********************

QString KryptEnt::encrypt(QString begin, QString pw )

{

	if(pw.size()<20)

	{

		QMessageBox::information( this, "Password Error", "The Password is to short(min. 20 chars)!", QMessageBox::Ok );

		return "failed";

	}
	if(begin.size()<pw.size())

	{
		QString msg = QString("The text is to short(min. %1 chars)!").arg( QString::number(pw.size()) );

		QMessageBox::information( this,"Text Error", msg, QMessageBox::Ok );

		return "failed";

	}



	QString out;

	for(int i=0; i < pw.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ pw.at(i).toAscii());
		out.append(c);
	}

	for(int i = pw.size(); i < begin.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ begin.at(i - pw.size()).toAscii());
		out.append(c);
	}


	return out;

}



QString KryptEnt::decrypt(QString begin, QString pw)

{

	QString out;

	for(int i=0; i < pw.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ pw.at(i).toAscii());
		out.append(c);
	}

	for(int i = pw.size(); i < begin.size(); i++)
	{
		QChar c = QChar(begin.at(i).toAscii() ^ out.at(i - pw.size()).toAscii());
		out.append(c);
	}


	return out;

}



//****************own solts********************************

void KryptEnt::kryptn()

{

	ausgabe->setText( encrypt( text->toPlainText(), pw->text() ) );

}

void KryptEnt::entkryptn()

{

	ausgabe->setText( decrypt( text->toPlainText(), pw->text() ) );

}


ja ich weiss mein englisch und meine variablen nameswahl sind grausam -.-
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Ok, also ich finde in deinem Code absolut keinen Fehler. Leider weiß ich aber auch nicht wonach ich suchen soll. Ich habe gestern mal schnell selbst eine Version geschrieben, die einwandfrei funktioniert. Findest Sie im Anhang.

Hier noch ein Testprogramm:

Code: Alles auswählen

#include <QtCore/QCoreApplication>
#include <QtCore/QTextStream>

#include "qcryptxortext.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTextStream out (stdout);

    QString text ("Hallo Welt!!! Mein Name ist Hase!");
    QString passwd ("passwors");

    QCryptXorText cipher;
    cipher.setPasswd(passwd);
    cipher.setText(text);
    QString result(cipher.crypt());
    out << result << endl;

    cipher.setText(result);
    QString decrypted(cipher.decrypt());
    out << decrypted << endl;

    return a.exec();
}
Schau es dir mal an, kannst es auch verwenden, wenn du willst.

EDIT: man sollte es natürlich mit hochladen ;)
Dateianhänge
CryptLib.tar.gz
Heißt zwar CryptLib, ist aber nur die Xor-Verschlüsselung mitm Text drinne... Rest behalte ich mir 8)
(744 Bytes) 163-mal heruntergeladen
Irods
Beiträge: 53
Registriert: 24. Mai 2009 20:57
Kontaktdaten:

Beitrag von Irods »

cool danke aber ich probier meine sache noch ma richtig hin zu
bekommen hab die auch ncoh ma so um geschrieben das man eine
Datei verschluesselt und nicht nur den text der in nem QTextEdit Feld
steht.
Ach ja nur so ne Idee also ich hab bei mir immer den Buchstaben zum
xoren verwendet der die Länge des Passworts hinter dem zu verschlüsselnden Buchstaben lag.
Hat den Vorteil das es sicherer ist.

Gruss und dank irods
Antworten