Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Pomoc cryptování, decryptování.

Aktivity
Avatar
Vítězslav Skopal:29.8.2018 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.8.2018 12:38
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Vítězslav Skopal
Martin Dráb:29.8.2018 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.8.2018 12:58
2 + 2 = 5 for extremely large values of 2
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29.8.2018 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.8.2018 15:11
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Vítězslav Skopal:29.8.2018 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.8.2018 16:25
 
Nahoru Odpovědět
29.8.2018 16:23
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29.8.2018 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.8.2018 16:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29.8.2018 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.8.2018 17:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Vítězslav Skopal:29.8.2018 17:53

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

 
Nahoru Odpovědět
29.8.2018 17:53
Avatar
Odpovídá na Vítězslav Skopal
Matúš Olejník:29.8.2018 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.8.2018 21:45
/* I am not sure why this works but it fixes the problem */
Avatar
DarkCoder
Člen
Avatar
DarkCoder:29.8.2018 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
29.8.2018 21:48
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Matúš Olejník:29.8.2018 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.8.2018 22:30
Nahoru Odpovědět
29.8.2018 22:29
/* I am not sure why this works but it fixes the problem */
Avatar
Roman
Člen
Avatar
Roman:29.8.2018 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.8.2018 22:45
Avatar
Roman
Člen
Avatar
Odpovídá na Vítězslav Skopal
Roman:29.8.2018 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.8.2018 23:03
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Matúš Olejník
DarkCoder:29.8.2018 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
29.8.2018 23:04
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vítězslav Skopal
DarkCoder:29.8.2018 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
29.8.2018 23:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Vítězslav Skopal:30.8.2018 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.8.2018 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.