Bild verschlüsseln

Nun... die "billig" version sieht so aus:

zum "entschlüsseln" -1 anstatt +1.

Achtung untested - hab grad keinen C Compiler zur hand, keine garantie, dass nicht irgendwo noch tippfehler drin sind.
C++:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    FILE *fpin, *fpout;
    if (argc != 3) {
       printf("Usage: program <inputfile> <outputfile>");
       exit(-1);
    }

    fpin = fopen(argv[1], "rb");
    fpout = fopen(argv[2], "wb");
    if(!fpin || !fpout) {
        printf("fopen failed");
        exit(-2);
    }
    while(!feof(fpin)) {
        fputc((unsigned char)(fgetc(fpin) + 1), fpout);
    }
    fclose(fpin);
    fclose(fpout);
    return 0;
}

edit: stdlib.h eingefügt um warnings bezüglich exit() zu unterdrücken.
 
Zuletzt bearbeitet:
Beim "fopen failed" sollte der eventuell geöffnete andere Stream auch wieder geschlossen werden.
Binärmodus beim fopen?
Und außerdem sollte das Ganze ja mit iostreams gemacht werden.
 
kann gerne nach belieben erweitert und verbessert werden.
Aktuelle OS schliessen dateihandle so und so sauber, wenn die applikation beendet wird, aber ja, ganz korrekterweise würde man den anderen handle noch schliessen.

binary mode wäre aus kompatiblitätsgründen sinnvoll, ist aber in der regel nicht notwendig. ... ich pass es trotzdem mal an.

iostrams... ich mag diese STL dinger nicht... und der OP schieb nur, dass er es damit versucht hat, nicht dass er es unbedingt damit machen will. Das da oben ist ANSI-C code.
 
Hi.

@chibisuke: Man sollte niemals feof auf diese Weise verwenden, das funktioniert nicht generell. Man sollte vielmehr prüfen, ob 1. etwas gelesen wurde und 2. auch etwas geschrieben wurde!

Weiterhin ist eine sehr einfache, effektive Verschlüsselung die XOR Verknüpfung mit einer beliebigen, von 0 verschiedenen Zahl.

Solche Transformationen kann man in C++ relativ elegant mit dem std::transform Algorithmus durchführen:
C++:
#include <fstream>
#include <iterator>
#include <algorithm>
#include <functional>

...

std::ifstream in("bla.jpg", std::ios::binary);
std::ofstream out("bla.jpg.x", std::ios::binary);

if (!in.is_open()) return 1;
if (!out.is_open()) return 2;

char key = 1;

std::istreambuf_iterator<char> start(in), end;

std::transform(start, end,
               std::ostreambuf_iterator<char>(out),
               std::bind1st(std::plus<char>(), key));

if (start != end) {
  // failed reading input file
  ...
}
if (!out) {
  // failed writing output file
  ...
}
Gruß
 
Zurück