Diskuze: Pomoc cryptování, decryptování.
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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;
}
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ů.
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.
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;
}
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");
Zdrojovy kod uz funguje suprove ale obrazek jsem stejne nerozkryptoval. Duvod bude nespise v prvni casti dekodovani pomoci xor.
Není nad to si vše vytvořit sám. Zde pak je kód pro zakódování/rozkó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");
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í
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;
}
}
}
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)
Super postřeh! Otáčet
bity nebo otáčet řetězec, zní to podobně, ale docela zásadní rozdíl.
Díky za info.
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");
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...
Zobrazeno 15 zpráv z 15.