Zadatak u C-u, pomoc

  • Začetnik teme Začetnik teme vucmi
  • Datum pokretanja Datum pokretanja

vucmi

Početnik
Poruka
7
Pozdrav, treba mi pomoc oko jednog projekta kojim se zanimam trenutno, ako nije problem. Naime, zelim da napravim nesto tipa programa za enkripciju. Na predavanju iz programiranja sam pitao profesora kako bi to moglo da se uradi, ali njegov sistem nije funkcionisao, pa me zanima da li je uopste moguce tako. Ovako bi, po njemu, trebalo da radi. char x, getchar(X!=EOF) i onda da se svaki uneti karakter zameni nekim drugim, odnosno da mu se oduzme njegova vrednost i dodeli neka druga. Profesor je rekao da osim f-ja lower i upper, mogu na ovaj nacin da se mala slova pretvore u velika, i obrnuto, slovo po slovo. Tako je meni i palo na pamet da probam da napravim ovo, ali ne ide. Video sam svuda po netu razne kodove za enkripcijske programe, ali nijedan nije na ovu foru, i radi automatsko dodeljivanje. A poenta ovog mog koda, je da samo onaj ko napravi program zna kljuc enkripcije. Naravno, posle bih napravio isto to za dekripciju, ali to ce ici lako ako ovo uspe. Hvala unapred :)
 
Hm....ulazis u pricu kriptografije, a nisi rekao elementarnu stvar: Da li pravis program za simetricnu ili asimetricnu enkripciju? Ako zelis simetricnu (da istim kljucem otkljucavas i zakljucavas), ond upotrebi prostu XOR operaciju, nad kljucem i porukom.
Profesor te je dobro naveo, s obzirom da je ulaz neki string, radices u svakom prolazu sa pojedinacnim karakterom.
Prvo, obezbedi da ti kljuc bude iste duzine kao poruka, i da bude isto neki string.
Zatim, citaj karakter po karakter (kljuca i poruke).
Odradi XOR operaciju nad procitanim karakterima, i sacuvaj je u neki novi string, ili niz karaktera, ili listu, ili sta god..
I to je to. Taj noviniz karaktera, string, lista, sta vec, je sifrat, koji na isti nacin, pomocu istog kljuca, mozes da desifrujes.
To su ti smernice.
Dalje se snadji :)
 
#include <stdio.h>
#include <string.h>

void xor_encrypt(char *key, char *string, int n)
{
int i;
int keyLength = strlen(key);
for( i = 0 ; i < n ; i++ )
{
string=string^key[i%keyLength];
}
}

int main(void) {
char plain[] = "This is plain text";
char key[] = "Abcdabcdabciabcdabcd";
int n = strlen(plain);
// encrypt:
xor_encrypt(key, plain, n);
printf("encrypted string: \n");
for(int ii = 0; ii < n; ii++) {
if(plain[ii] > 0x32 && plain[ii] < 0x7F ) printf("%c", plain[ii]);
else printf(" 0x%02x ", plain[ii]);
}
printf("\n");
// **** if you include this next line, things go wrong!
n = strlen(plain);
xor_encrypt(key, plain, n);
printf("after round trip, plain string is '%s'\n", plain);
}
 
Pozdrav, treba mi pomoc oko jednog projekta kojim se zanimam trenutno, ako nije problem. Naime, zelim da napravim nesto tipa programa za enkripciju. Na predavanju iz programiranja sam pitao profesora kako bi to moglo da se uradi, ali njegov sistem nije funkcionisao, pa me zanima da li je uopste moguce tako. Ovako bi, po njemu, trebalo da radi. char x, getchar(X!=EOF) i onda da se svaki uneti karakter zameni nekim drugim, odnosno da mu se oduzme njegova vrednost i dodeli neka druga. Profesor je rekao da osim f-ja lower i upper, mogu na ovaj nacin da se mala slova pretvore u velika, i obrnuto, slovo po slovo. Tako je meni i palo na pamet da probam da napravim ovo, ali ne ide. Video sam svuda po netu razne kodove za enkripcijske programe, ali nijedan nije na ovu foru, i radi automatsko dodeljivanje. A poenta ovog mog koda, je da samo onaj ko napravi program zna kljuc enkripcije. Naravno, posle bih napravio isto to za dekripciju, ali to ce ici lako ako ovo uspe. Hvala unapred :)
ISPRAVLJENO vrlo je jednostavno.
Kod:
#include "windows.h"

[COLOR="#696969"]typedef unsigned char [/COLOR]_256

[COLOR="#696969"]#define [/COLOR]my_CRIPT 1
[COLOR="#696969"]#define [/COLOR]my_ENCRIPT 0

[COLOR="#000080"]_256 [/COLOR]pFileDataBase[1024]; // ZA FAJL OD 1024 BAJTOVA(SLOVA), AKO CES DRUGACIJE PROMIJENI

[COLOR="#000080"]void[/COLOR] CriptOrEncript (char*, _256);

[COLOR="#000080"]void[/COLOR] main (void)
{
    // primjer, i obavezno kad kucas ime fajla umjest \ kucaj \\
    CriptOrEncript ("C:\\MyProgramFiles\\preview.txt", my_CRIPT); //kasnije zamijeni s my_ENCRIPT, da vidis rezultat
}

[COLOR="#000080"]void[/COLOR] CriptOrEncript (char* p_fileName, _256 p_CriptOrEncript) // tu uneses my_CRIPT ili my_ENCRIPT u zavisnosti od toga oces li kriptovanje ili enkripciju.
{
    [COLOR="#000080"]HANDLE[/COLOR] l_fileHandle
    [COLOR="#000080"]LARGE_INTEGER[/COLOR] l_fileSizeP;
    [COLOR="#000080"]unsigned long[/COLOR] l_ReadOrWriteFileP;
    [COLOR="#000080"]unsigned long[/COLOR] l_fileSize;

    h_FLEMSFC = CreateFileA(p_fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    GetFileSizeEx(l_fileHandle, &l_fileSizeP);
    l_fileSize = l_fileSizeP.LowPart + l_fileSizeP.HighPart;
    ReadFile(l_fileHandle, &pFileDataBase, l_fileSize, &l_ReadFileP, NULL);
    CloseHandle(l_fileHandle);

    [COLOR="#000080"]short[/COLOR] i = 0;
    [COLOR="#000080"]short[/COLOR] l_fileSize = (short)l_fileSize;
    [COLOR="#000080"]_256[/COLOR] l_this_256;

    [COLOR="#000080"]if [/COLOR](p_CriptOrEncript == my_CRIPT)
    {
        for (i; i < l_fileSize; i++)
        {
            l_this_256 = pFileDataBase[i];
            [COLOR="#000080"]if [/COLOR](p_CriptOrEncript == my_CRIPT)
                l_this_256 += 32;
            [COLOR="#000080"]else if [/COLOR](p_CriptOrEncript == my_ENCRIPT)
                l_this_256 -= 32;
            [COLOR="#000080"]else[/COLOR]
                MessageBoxA(NULL, "E R R O R: p_CriptOrEncript,\n\r must be my_CRIPT or my_ENCRIPT", "ERROR", MB_OK);

            [COLOR="#000080"]if [/COLOR](l_this_256 <= 125)
                l_this_256 += 125;
            [COLOR="#000080"]else[/COLOR]
                l_this_256 -= 125;
            pFileDataBase[i] = l_this_256;
        }

    l_fileHandle = CreateFileA(p_fileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    WriteFile(l_fileHandle, &pFileDataBase, long(l_fileSize), &l_ReadOrWriteFileP, NULL);
    CloseHandle(l_fileHandle);
}
 
Poslednja izmena:

Back
Top