• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Qt, program szyfrujący. Problem z xorowaniem plików *.png ( i prawdopodobnie innych też )

Object Storage Arubacloud
0 głosów
283 wizyt
pytanie zadane 13 kwietnia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 15 kwietnia 2019 przez Jakub 0

Hej, ucząc się Qt napisałem kolejny prosty okienkowy program, myślę że tytuł pytania wszystko mówi czym się on zajmuje:

szyfrowanie prostych plików tekstowych przebiega bez problemu:

oto najważniejsze metody programu:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QString>
#include <QTextStream>

//---------------------------------------------------------------------------

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

//---------------------------------------------------------------------------

MainWindow::~MainWindow()
{
    delete ui;
}

//---------------------------------------------------------------------------

void MainWindow::on_saveButton_clicked()
{
    QString file_name = QFileDialog::getOpenFileName(
                this,
                "open file",
                QDir::homePath()
    );

    QFile file(file_name);

    if(!file.open(QFile::WriteOnly | QFile::Text)){
        QMessageBox::warning(this, "error", "File is not open");
    }

    else {
        QTextStream in(&file);
        QString text = ui->fileTextEdit->toPlainText();
        in << text;
        file.close();
    }
}

//---------------------------------------------------------------------------

void MainWindow::on_readButton_clicked()
{
    QString file_name = QFileDialog::getOpenFileName(
                this,
                "open file",
                QDir::homePath()
        );

    QFile file(file_name);

    if(!file.open(QFile::ReadOnly | QFile::Text)){
        QMessageBox::warning(this, "error", "File is not open");
    }

    else {
        QTextStream in(&file);
        QString text = in.readAll();
        ui->fileTextEdit->setPlainText(text);
        file.close();
    }
}

//---------------------------------------------------------------------------

void incrementKeyIterator(const QString& str, int& it) {
    if(it == str.size()-1)
        it = 0;
    else
        ++it;
}

void MainWindow::on_xorButton_clicked()
{
    QString text = ui->fileTextEdit->toPlainText();
    QString key = ui->keyLineEdit->text();

    if(text=="" || key=="") {
        QMessageBox::warning(this, "error", "File or key is empty");
    }

    else {
        int it = 0;
        for(int i=0; i<text.size(); ++i){
            unsigned short ccode1 = text[i].unicode();
            unsigned short ccode2 = key[it].unicode();
            int result = ccode1^ccode2;
            text[i] = result;
            incrementKeyIterator(key,it);
        }

        ui->fileTextEdit->setPlainText(text);
    }
}

//---------------------------------------------------------------------------

Problem jest taki że o ile praca na plikach *.txt przebiega poprawnie to juz inaczej jest w przypadku np. zdjęć. Nawet po samym otwarciu takiego pliku w moim programie i zapisaniu go z powrotem ( bez żadnej modyfikacji/szyfrowania ) otrzymuje:

Nie wiem do końca w czym jest problem, może z kodowaniem, może ze znakiem końca pliku który jest usuwany, a może modyfikacja powinna przebiegać w trybie binarnym... Bardzo wam z góry dziękuje za pomoc i wskazanie możliwej przyczyny problemu. Pozdrawiam :)

komentarz zamknięcia: problem rozwiązany.
komentarz 15 kwietnia 2019 przez Jakub 0 Pasjonat (23,120 p.)
to jest tylko podgląd który w każdej chwili mogę usunąć. Same dane na których pracuję zapisuje do obiektu m_data typu QByteArray.
2
komentarz 15 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)

Wciąż też czytasz dane jako teskt:

if(!file.open(QFile::ReadOnly | QFile::Text)){

 

1
komentarz 15 kwietnia 2019 przez j23 Mędrzec (194,920 p.)

I zapisuje też:

if(!file.open(QFile::WriteOnly | QFile::Text)){

 

komentarz 15 kwietnia 2019 przez Jakub 0 Pasjonat (23,120 p.)

Jest! Kompletnie zapomniałem to zmienić...

@adrian17

Daj pierwszy komentarz jako odpowiedź to dam NAJ. I sorry za zawracanie głowy ;)

1
komentarz 15 kwietnia 2019 przez mrspock1 Mądrala (6,420 p.)
Nie zawsze zmiana pliku fotografii da plik, który da się otworzyć jako fotografia. Najczęściej nie ma problemu z plikami bmp bo nie są kompresowane. Istnieje technika zapisu informacji na dwóch najmniej znaczących bitach bajtu dla zaszyfrowania. Obrazek nie jest zmieniony, ale program analizujący potrafi rozpoznać że kolory są nierównomierne i że mogą zawierać zaszyfrowaną informację. Możesz zapisać więcej niż na dwóch bitach ale już pojawia się śnieg na obrazku.

Tu więcej o tym

http://informatyka-delphi.blogspot.com/2018/09/szyfrowanie.html

1 odpowiedź

0 głosów
odpowiedź 15 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 15 kwietnia 2019 przez Jakub 0
 
Najlepsza
Podsumowanie, jak chcemy obsługiwać pliki binarne:

- używamy trybu binarnego czytania i pisania plików

- nie przechodzimy przez std::stringi lub Qstringi

- nie przechodzimy przez pola tekstowe

Oraz ogólnie unikamy `new`.

Podobne pytania

–2 głosów
3 odpowiedzi 2,536 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez HaSen Nowicjusz (230 p.)
0 głosów
1 odpowiedź 207 wizyt
0 głosów
3 odpowiedzi 1,253 wizyt
pytanie zadane 29 stycznia 2018 w C i C++ przez Cylian Początkujący (280 p.)

92,556 zapytań

141,404 odpowiedzi

319,563 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...