Avatar billede emileej Nybegynder
04. juni 2001 - 15:30 Der er 20 kommentarer og
2 løsninger

Den ubrydelige kryptering!

Tjaæhhh - den har jeg opfundet - den er så ubrydelig at jeg ikke kan dekryptere den selv :) i hvert fald ikk det hele *gg*

Nå - slut med det sjawe. Koden til at kryptere teksten er herunder:

                AnsiString krypteringsTekst=tekst->Text;
                for(int i=0;i < krypteringsTekst.Length();i++){
                        hovedVindue->Update();
                        progressForm->Update();
                        progressForm->progressViser->Progress=(i*100)/tekst->Lines->Count;
                        chr = krypteringsTekst[i+1];
                        chr = (char)(((int)chr)+((int)KryptKode[j]));
                        chr = (char)(((int)chr) % 255);
                        krypteringsTekst[i+1]=chr;
                        if(j < kodeLen)
                                j++;
                        else
                                j=1;
                }
                tekst->Text=krypteringsTekst;

Dette er koden til at dekryptere:

                AnsiString krypteringsTekst=tekst->Text;
                for(int i=0;i < krypteringsTekst.Length();i++){
                        hovedVindue->Update();
                        progressForm->Update();
                        progressForm->progressViser->Progress=(i*100)/tekst->Lines->Count;
                        chr = krypteringsTekst[i+1];
                        chr = (char)(((int)chr)-((int)KryptKode[j]));
                        chr = (char)(((int)chr) % 255);
                        krypteringsTekst[i+1]=chr;
                        if(j < kodeLen)
                                j++;
                        else
                                j=1;
                }
                tekst->Text=krypteringsTekst;

Mit problem er, at når jeg krypterer tekster over en vis længde, bliver dekrypteringen kun delvis - det vil sige at en del tegn helt er forsvundet og en anden del stadigt er krypteret. Kun lidt af starten er blevet dekrypteret...

Det er ret wired :-/

E-)mil
http://eej.dk
http://fotx.net/emileej
Avatar billede stigc Nybegynder
04. juni 2001 - 21:56 #1
hvad starter dit j med første gang ? nul? Så skal du også sætte j=0 hvis (j<kodeLen)
Avatar billede emileej Nybegynder
05. juni 2001 - 12:30 #2
upz - j bliver initialiseret med verdien 1 længere opppe i koden...
Avatar billede dejbjerg Nybegynder
05. juni 2001 - 17:01 #3
Hej Emil jeg troede du vidste det hele :)

jf: http://www.eksperten.dk/spm/72780

Nok om det ..

chr = (char)(((int)chr)-((int)Kryptkode[j])); - der er ikke nogen grund til at typecaste til hhv. char og int ...  chr = chr - Kryptkode[j]; - giver samme resultat (næsten) - i sidste ende betyder det ikke noget.

chr = (char)(((int)chr)%255) - denne sætning har ingen effekt ... en char er default signed dvs. -127 til 127. Modulo division returnerer en rest - 127/255 = 0, rest = 127 (127%255=127).

Dit problem ligger (tror jeg) i enten krypteringsTekst.Length() eller i kodelen - prøv at skrive -1 bag ved dem begge.

Hvis j er global eller derhenad skal du huske at sætte den tilbage til 1 inden du starter med dekryptering.

Starter en ansistreng i streng[1]?


Avatar billede emileej Nybegynder
05. juni 2001 - 22:28 #4
>>dejbjerg

Det troede jeg også - det gik bare op for mig at det kun var i teorien :)~

Ja - en AnsiString starter (iriterende nok) på 1 - det er også derfor at jeg ikke skriver -1 foran krypteringsTekst.Length() (hvilket havde været korrekt at gøre hvis der var tale om en char streng)...

Jeg har løst problemet med længden af teksten - ved at ændre initialiseringen af krypteringsTekst fra:
AnsiString krypteringsTekst=tekst->Text;
til:
AnsiString krypteringsTekst=AnsiString(tekst->Text);

Nu er der bare det, at hvis jeg krypterer en tekst flere gange, så forsvinder en del tegn...

Jeg har mistanke om at den der AnsiString kun vil tage ansi tegn (fornuftigt tænkt ikk :)~ ), og derfor sier de tegn fra, der ikk er almindelige i en tekst - dem der dukker op under en kryptering...

Hvad jeg så har brug for, er et alternativ til min AnsiString, eller en måde at bypasse dens kræsne opfattelse af tegn...

E-)mil
http://eej.dk
http://fotx.net
Avatar billede dejbjerg Nybegynder
06. juni 2001 - 02:20 #5
#include <cstring>
#include <string>

char str[] = \"dette er noget tekst\";

eller

int MAX = 40;
char str[MAX];
cin.getline(str, MAX); // eller cin.getline(str, MAX, \'\\n\'; (læser indtil \'\\n\' dvs. retur)

eller du kan studere char* , men der er jeg ikke til meget hjælp.

Jeg selv bruger filer -


/*Et meget simpelt krypteringsprogram. Læser filerne textFile.txt og keyFile.txt char for char og lægger de to char sammen i en tredie char, som skrives til filen codeFile.txt. Derefter dekrypteres til deFile.txt. Brugeren skal selv oprette filerne textFile.txt og keyFile.txt */

// includes
#include <iostream>
#include <fstream>

// namespace
using namespace std;

// function declarations
int encrypt();
int decrypt();

// main
int main()
{
encrypt();
decrypt();
return 0;
}

// the encrypt function
int encrypt()
{
    char cht, chk, chc;
    cht = chk = chc = 0;

ifstream keyFile(\"keyFile.txt\");
ifstream textFile(\"textFile.txt\");

ofstream outFile(\"codeFile.txt\");
   
    while (textFile)
    {
   
        keyFile.seekg(0, ios::end);   
        int endpos = keyFile.tellg();
        keyFile.seekg(0, ios::beg);
       
        for (int i = 0; i < endpos; i++)
        {
            textFile.get(cht);
       
            if (textFile.eof())
                return 0;
           
            keyFile.seekg(i);
            keyFile.get(chk);
       
            if (i == endpos - 1)
                i = -1;

            chc = cht + chk;
            outFile.put(chc);
        }   
    }

return 0;
}

// the decrypt function
int decrypt()
{
    char chc, chk, chd;
    chc = chk = chd = 0;

ifstream keyFile(\"keyFile.txt\");
ifstream codeFile(\"codeFile.txt\");

ofstream outFile(\"deFile.txt\");

    while (codeFile)
    {   
        keyFile.seekg(0, ios::end);   
        int endpos = keyFile.tellg();
        keyFile.seekg(0, ios::beg);
       
        for (int i = 0; i < endpos; i++)
        {
            codeFile.get(chc);
       
            if (codeFile.eof())
                return 0;
            keyFile.seekg(i);
            keyFile.get(chk);
       
            if (i == endpos - 1)
                i = -1;

            chd = chc - chk;
            outFile.put(chd);
        }
    }       
           
return 0;   
}



Avatar billede dejbjerg Nybegynder
06. juni 2001 - 02:27 #6
Der er temmelig mange medlemsfunktioner i string og cstring, men der er du nok nødt til at kigge i en bog :)
Avatar billede emileej Nybegynder
06. juni 2001 - 14:34 #7
Kan jeg ikk bare lave en:
char str[strlen(tekst->Text.c_str())]=tekst->Text.c_str();
i stedet for den der AnsiString?

E-)mil
Avatar billede dejbjerg Nybegynder
07. juni 2001 - 03:06 #8
Hej Emil.

Det kan jeg ikke svare på.

Hvorfor bruger du alle de snørklede -> operatorer?

Hvis jeg skulle lave det med strenge ville jeg gøre noget ala detteher:


#include <iostream>
#include <string>

using namespace std;

const int MAX = 255;

void main()
{
    char s1[MAX] = \"dette er den tekst, der skal kodes\";
    char s2[MAX], s3[MAX];
    char endstring = \'\\0\';
    char text, key, kod;

    cout << \"Indtast koden \";
    cin.get(s2, MAX, \'\\n\');
   
    cout << endl << s1 << endl;
   
    for (int i = 0, j = 0; i < strlen(s1); i++, j++)
    {
        if (j == strlen(s2))
            j=0;
       
        text = s1[i];
        key = s2[j];
        kod = text + key;

        s3[i] = kod;

        cout << s2[j];

        if(i == strlen(s1)-1)
            s3[i+1] = endstring;
       
    }
    cout << endl ;
    cout << s3 << endl;

   
    for (i = 0, j = 0; i < strlen(s3); i++, j++)
    {
        if (j == strlen(s2))
            j=0;
       
        kod = s3[i];
        key = s2[j];
        text = kod - key;

        s3[i] = text;

        if(i == strlen(s1)-1)
            s3[i+1] = endstring;
       
    }
   
    cout << s3 << endl << endl;
}
Avatar billede dejbjerg Nybegynder
07. juni 2001 - 03:39 #9
Det tror jeg nu godt du kan.
Avatar billede emileej Nybegynder
07. juni 2001 - 07:46 #10
Jeg vil hellere prøve med
char str[strlen(tekst->Text.c_str())]=tekst->Text.c_str();
da jeg ikke kan lide MAX delen i din kode :)

E-)mil
Jeg tester det når jeg får fri idag
Avatar billede emileej Nybegynder
07. juni 2001 - 13:51 #11
Det hjalp ikke...
Avatar billede dejbjerg Nybegynder
08. juni 2001 - 00:51 #12
Er der ikke noget med at en strenge-erklæring ala
char str[], kun tager const argumenter.

følgende giver vistnok en fejl:

char s1[] = \"noget tekst\";
char s2[strlen(s1)];

Men du kan bruge:

string s1, s2;

uden at behøve at angive indhold eller størrelse.

Jeg bryder mig bare ikke om at arbejde med medlemsfuktionerne i string. Jeg synes de er bøvlede. En string kan konverteres til char s[], hvis man vil det - men det kan jeg se at du godt ved ..Text.c_str();..

Har du prøvet: char str[] = tekst->Text.c_str();
Avatar billede dejbjerg Nybegynder
08. juni 2001 - 04:11 #13
Hej Emil

Hvis du får tid så prøv evt. at besøge
http://www.eskimo.com/~weidai/cryptlib.html
Avatar billede dejbjerg Nybegynder
08. juni 2001 - 07:40 #14
NB! Hvis du downloader, skal du ikke bruge eksempelprogrammet - det har fucked up i Visual C++. Jeg kan ikke engang compilere det mest simple HelloWorld i MFC.

Geninstallerer .... :-X

Nøjes med at studere/bruge filerne.
Avatar billede emileej Nybegynder
08. juni 2001 - 08:02 #15
>>dejbjerg
Jeg vil nu helst have mit eget til at funke :)
Du bruger VC++?! Det jeg laver er i Borland Builder...
Ja det har jeg prøvet - det kunne jeg ikke få til at virke.
Det jeg tror er, at AnsiString str=AnsiString(KrypteretTekst); fjerner alle ikke tal / bogstaver eller alm. tegn...
Fejlen opstår jo først når man prøver at kryptere anden gang (krypterer krypteringen)...

E-)mil
Avatar billede emileej Nybegynder
09. juni 2001 - 15:35 #16
Hved er forskellen på en String og en AnsiString?
Avatar billede dejbjerg Nybegynder
09. juni 2001 - 18:25 #17
Det skulle ikke have nogen indflydelse hvilken compiler der bruges.

Hvis du kan fortælle mig hvad en AnsiString er kan jeg måske svare. Jeg har prøvet at slå den op, men kunne ikke finde en header fil.
Avatar billede emileej Nybegynder
10. juni 2001 - 11:06 #18
Hmmm - du har ikk borland builder? Der er ret meget om *AnsiString objektet i hjælpen - AnsiString er et stort objekt med mange funktioner...
Avatar billede dejbjerg Nybegynder
14. juni 2001 - 01:52 #19
Hvorfor bruger du den, er den et must?
Avatar billede emileej Nybegynder
14. juni 2001 - 07:33 #20
AnsiString bliver brugt overalt i Borlan Builder - derfor ville det være nemmeste med den :)

[Det er ikk sundt at være så sent oppe på en hverdag *gg*]

E-)mil
Avatar billede emileej Nybegynder
06. juli 2001 - 09:13 #21
Tak for svarene dejbjerg - kikker på den der C løsning, når jeg kommer hjem fra ferie :)

E-)mil
http://eej.dk
http://fotx.net/emileej
Avatar billede dejbjerg Nybegynder
07. juli 2001 - 12:26 #22
Det var så lidt.
Jeg er ked af at jeg ikke kunne være til mere hjælp med dit specifikke ansistreng-problem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester