Seite 1 von 1
Verschluesselung funktioniert nicht
Verfasst: 21. August 2009 19:09
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
Verfasst: 21. August 2009 20:28
von upsala
Und was sagt dein Debugger dazu?
Verfasst: 22. August 2009 13:17
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.
Verfasst: 22. August 2009 13:22
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
Verfasst: 22. August 2009 13:29
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 -.-
Verfasst: 22. August 2009 13:34
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...
Verfasst: 22. August 2009 13:45
von Irods
das hier ist der entscheidende unterschied:
die nachricht verschluesselt sich mit sich selbst bis auf den anfang der
vom pw verschluesselt wird.
Verfasst: 22. August 2009 13:55
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....
Verfasst: 22. August 2009 14:38
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 -.-
Verfasst: 23. August 2009 12:32
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

Verfasst: 24. August 2009 17:12
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