Avatar
Vítězslav Skopal:29. srpna 12:38

Ahoj všem, nevím si rady s dekryptováním obrázku. Jedná se o Mystery Cash na geocashingu. potřebuji ze souboru encrypted.jpg dostat standardní obrázek kde jsou indicie na již třetí etapu této mysterky. Dle rozluštěné indicie je potřeba tento obrázek decryptovat pomocí klíče XOR v ascii klíč je "geocashing". Dále je napsáno že je potřeba ve výsledným souboru otočit každý bit abychom dostali standardní obrázek. Povedlo se mi získat rozluštěný soubor bez klíče ale nevím jak otočit každý bit v souboru. Pro jistotu sem dávám originální jpg bez rozluštění.
Někdo nějakou radu popřípadě zdroják pro app co to zvládne? Já už začínám být beznadějný :) . Díky každému za pomoc.

Odkaz na jpg je zde JPG

Zkusil jsem: Decryptování jsem xor jsem dělal na https://wiremask.eu/…xor-cracker/

Chci docílit: Decryptování JPG obrázku.

 
Odpovědět 29. srpna 12:38
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Vítězslav Skopal
Martin Dráb:29. srpna 12:58

Otočení bitu znamená změnu z 0 na 1 a z 1 na 0, tedy logické NOT. Pokud máš data obrázku na adrese v proměnné Buffer a jejich velikost v parametru Size, otočení provede následující kód:

void NOTOnBuffer(unsigned char *Buffer, size_t Size)
{
  for (size_t i = 0; i < Size; ++i) {
    *Buffer[= ¬*Buffer;
    ++Buffer;
  }

  return;
}
Nahoru Odpovědět 29. srpna 12:58
2 + 2 = 5 for extremely large values of 2
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29. srpna 15:11

Otočení bitů provedeš pomocí bitového doplňku ~. Pro celý soubor můžeš použít následující funkci:

FILE * fileBITNOTcopy(FILE *src, FILE *dst) {
        unsigned char c;

        while (!feof(src)) {
                c = fgetc(src);
                if (!feof(src)) fputc(~c, dst);
        }
        return dst;
}

Funkce vrací ukazatel na soubor po otočení bitů. První parametr představuje ukazatel na soubor s daty, u kterého chceš bity otáčet. Druhý parametr představuje ukazatel na soubor, který má obsahovat data po otočení bitů.

Nahoru Odpovědět 29. srpna 15:11
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Vítězslav Skopal:29. srpna 16:23

Děkuji za perfektní a rychlé odpovědi. Jsem relativně amatér. Ale učím se. Dark coder nevím stále ještě kam doplnit cestu k oboum souborům.

Editováno 29. srpna 16:25
 
Nahoru Odpovědět 29. srpna 16:23
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29. srpna 16:41

Cesta k souborům je udávána prvním parametrem funkce fopen(). Ta využívá hlavičkový soubor stdio.h.
Využití výše uvedené funkce viz. následující kód. Kód z důvodu jednduchosti neobsahuje ošetření chyb, které by bezpodmínečně mělo být vždy při práci se soubory.

#include <stdio.h>

FILE * fileBITNOTcopy(FILE *src, FILE *dst);

int main(void) {
        FILE *fpsrc = fopen("encrypted.jpg", "rb");
        FILE *fpdest = fopen("finalfile.jpg", "wb");

        fileBITNOTcopy(fpsrc, fpdest);

        fclose(fpsrc);
        fclose(fpdest);

        return 0;
}

FILE * fileBITNOTcopy(FILE *src, FILE *dst) {
        unsigned char c;

        while (!feof(src)) {
                c = fgetc(src);
                if (!feof(src)) fputc(~c, dst);
        }
        return dst;
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 29. srpna 16:41
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29. srpna 17:06

Popřípadě si to můžeš ještě poupravit následovně:

void fileBITNOTcopy(char *srcfile, char *dstfile) {
        FILE *src;
        FILE *dst;
        int c;

        src = fopen(srcfile, "rb");
        dst = fopen(dstfile, "wb");

        while (!feof(src)) {
                c = fgetc(src);
                if (!feof(src)) fputc(~c, dst);
        }

        fclose(src);
        fclose(dst);
}

a volání funkce pak může vypadat takto:

fileBITNOTcopy("encrypted.jpg", "finalfile.jpg");
Nahoru Odpovědět 29. srpna 17:06
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Vítězslav Skopal:29. srpna 17:53

Zdrojovy kod uz funguje suprove ale obrazek jsem stejne nerozkryptoval. Duvod bude nespise v prvni casti dekodovani pomoci xor.

Presny popis co se ma se souborem dit posilam tady...

Gratuluji, uspesne jsi vylustil prvni fazi teto mysterky!
Pro vylusteni dalsi faze bude potreba trochu programovani, ale neboj se, neni to tak tezke.
Stahni si prosim tento soubor: https://nofile.io/…ncrypted.jpg
Jedna se o .jpg obrazek, ktery je ovsem zasifrovany.
Pro jeho zobrazeni musis provest po jednotlivych bytech XOR s klicem 'geocaching'
(bez uvozovek, mala pismena, kodovano podle ASCII), a pote vysledny retezec bytu otocit.
Pokud to udelas spravne, bude obrazek mozne zobrazit a z nej se dozvis co dal.

Hodne stesti!

 
Nahoru Odpovědět 29. srpna 17:53
Avatar
Odpovídá na Vítězslav Skopal
Matúš Olejník:29. srpna 21:45

OFF KOMENTÁR

Ahoj viem, že je to v sekcii pre jazyk C, ale ak by si náhodou už nevydržal čakať a chcel si pozrieť ten obrázok tak som napísal niečo v Jave a aby som to tu nešpinil kód si môžeš pozrieť tu a obrázok tu . GL v ďalšej časti :D

Nahoru Odpovědět 29. srpna 21:45
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
DarkCoder:29. srpna 21:48

Není nad to si vše vytvořit sám. Zde pak je kód pro zakódování/roz­kódování souboru pomocí XOR:

void fileXORdecrypt(char *srcfile, char *dstfile, char *key) {
        FILE *src;
        FILE *dst;
        int c;
        char *pkey = key;
        int keylength = strlen(key);

        src = fopen(srcfile, "rb");
        dst = fopen(dstfile, "wb");

        while (!feof(src)) {
                c = fgetc(src);
                if (!feof(src)) {
                        c ^= *pkey;
                        fputc(c, dst);
                        pkey++;
                        if (pkey >= (key + keylength)) pkey = key;
                }
        }

        fclose(src);
        fclose(dst);
}

Doporučuji si vše vyzkoušet na testovacím .jpg souboru.

Pro zakódování:

fileBITNOTcopy("image.jpg", "temp.jpg");
fileXORdecrypt("temp.jpg", "unknow.jpg", "geocaching");
remove("temp.jpg");

Pro rozkódování:

fileXORdecrypt("unknow.jpg", "temp.jpg", "geocaching");
fileBITNOTcopy("temp.jpg", "image.jpg");
remove("temp.jpg");
Nahoru Odpovědět  +1 29. srpna 21:48
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Matúš Olejník:29. srpna 22:29

Asi by si mu mal v Cčku upraviť tú funkciu fileBITNOTcopy lebo aj tak ten obrázok nerozkóduje pretože v pôvodnom príspevku síce písal

nevím jak otočit každý bit

ale v poslednom kde skopíroval celé znenie je

a pote vysledny retezec bytu otocit

takže treba nie invertovať každý bit ale pretočiť to pole bytov po xorovaní :D

Editováno 29. srpna 22:30
Nahoru Odpovědět  +1 29. srpna 22:29
/* I am not sure why this works but it fixes the problem */
Avatar
Roman
Člen
Avatar
Roman:29. srpna 22:45

Sice je to v sekci C ale tak pro inspiraci jsem splacal takovou rychlovku v C#

using System;
using System.Collections.Generic;
using System.IO;

namespace Decrypt_JPG
{
        class Program
        {
                static void Main (string [] args) {
                        string key = "geocaching";
                        bool res = WriteDecJPG (
                                "Decrypt.jpg",
                                ReadJPGEncFile (@"encrypted.jpg"),
                                key);
                        if (res)
                                Console.WriteLine ("Hotovo");
                        else
                                Console.Error.WriteLine ("Nepodarilo se!");
                }


                private static bool WriteDecJPG (string destFile, byte [] data, string key) {
                        byte [] newJPGFile = Decrypt (data, key);
                        Array.Reverse (newJPGFile);
                        try {
                                using (FileStream outFStream = File.Create (destFile)) {
                                        outFStream.Write (newJPGFile, 0, newJPGFile.Length);
                                }
                                return true;
                        }
                        catch {
                                return false;
                        }
                }


                private static byte [] ReadJPGEncFile(string path) {
                        List<byte> jpgFile = new List<byte> ();
                        int readByte;
                        using (FileStream fStream = File.Open (path, FileMode.Open, FileAccess.Read)) {
                                while ((readByte = fStream.ReadByte ()) != -1) {
                                        jpgFile.Add ((byte)readByte);
                                }
                        }

                        return jpgFile.ToArray ();
                }


                private static byte [] Decrypt (byte [] data, string key) {
                        int size = data.Length;
                        for (int i = 0; i < size; i++)
                                data [i] = (byte)(data [i] ^ (byte)key [i % key.Length]);

                        return data;
                }
        }
}
 
Nahoru Odpovědět 29. srpna 22:45
Avatar
Roman
Člen
Avatar
Odpovídá na Vítězslav Skopal
Roman:29. srpna 23:03

Jinak vysledny obrazek vypada dobre - pekny automat (pokud by jsi nevedel -Teorie jazyku a automatu predmet na VS Informatika druhy rocnik [asi] - uz je to dlouho)

 
Nahoru Odpovědět 29. srpna 23:03
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Matúš Olejník
DarkCoder:29. srpna 23:04

Super postřeh! :-) Otáčet bity nebo otáčet řetězec, zní to podobně, ale docela zásadní rozdíl. :-D Díky za info.

Nahoru Odpovědět  +1 29. srpna 23:04
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29. srpna 23:08

Na základě trefné připomínky Matúše posílám novou funkci do programu:

void fileREVERSEcopy(char *srcfile, char *dstfile) {
        FILE *src;
        FILE *dst;
        int c;
        long loc;

        src = fopen(srcfile, "rb");
        dst = fopen(dstfile, "wb");

        fseek(src, 0L, SEEK_END);
        loc = ftell(src) - 1;

        while (loc >= 0) {
                fseek(src, loc, SEEK_SET);
                c = fgetc(src);
                fputc(c, dst);
                loc--;
        }

        fclose(src);
        fclose(dst);
}

A volání funkcí:

fileXORdecrypt("encrypted.jpg", "temp.jpg", "geocaching");
fileREVERSEcopy("temp.jpg", "decrypted.jpg");
remove("temp.jpg");
Nahoru Odpovědět  +1 29. srpna 23:08
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Vítězslav Skopal:30. srpna 1:24

Chlapy vy jste proste borci. Moc Vam dekuji za vas cas a velice rychlou odpoved. Mam se hodne co ucit... :) Zdrojaky si schovam protoze si myslim ze v tomto oboru (geocashing) to neni naposledy co bude nejaky obrazek zacryptovany. V prvnim prispevku je pravda ze jsem to spatne popsal. Jinak ten automat mi taky nic nerika. Bohuzel mam pouze stredni skolu elektro. Budu muset prostudovat google jak z nej dostat GPS souradnice. Kazdopadne jeste jednou moc diky...

 
Nahoru Odpovědět 30. srpna 1:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.