Avatar billede alex_sleiborg Nybegynder
07. november 2006 - 20:44 Der er 10 kommentarer og
1 løsning

3des kryptering

Jeg har brug for at kryptere en string, til det formål har jeg fundet et eksempel på hvordan man laver en 3des kryptering. Men jeg kan ikke få det til at spille helt, på grund af min manglende c++ erfaring. Jeg poster lige den main.cpp fil, af det eksempel jeg har fundet. Hvordan får jeg den main metode, over i mit eget projekt, så det virker???

#define DEBUG 1
/* Encrypt/decrypt with triple DES */
#include <stdio.h>
#include "des.h"
#include "md5.h"

void gethex(char *result,char *cp,int cnt);
void memxor(char *,char *,int);
int doencrypt(DES3_KS,int cbc,char iv[8],FILE *in,FILE *out);
int dodecrypt(DES3_KS,int cbc,char iv[8],FILE *in,FILE *out);

main(int argc,char *argv[])
{
    int c,cnt,encrypt,decrypt,hexflag,tripflag,md5flag,keylen,cbc;
    register int i;
    char key[24],tkey1[256],tkey2[256],iv[8],*akey,*getpass();
    MD5_CTX mdcontext;
    DES3_KS ks;
    extern char *optarg;

    keylen = 8;
    tripflag = hexflag = encrypt = decrypt = md5flag = 0;
    cbc = 1;
    akey = NULL;
    while((c = getopt(argc,argv,"53hedk:b")) != EOF){
        switch(c){
        case 'e':
            encrypt++;
            break;
        case 'd':
            decrypt++;
            break;
        case 'k':
            akey = optarg;
            break;
        case 'b':
            cbc = 0;
            break;
        }
    }
    if(encrypt == 0 && decrypt == 0){
        fprintf(stderr,"Usage: des -e|-d [-b] [-k key]\n");
        exit(2);
    }
    if(akey == NULL){
        /* No key on command line, prompt for it */
        memset(tkey1,0,sizeof(tkey1));
        memset(tkey2,0,sizeof(tkey2));
        for(;;){
            akey = getpass("Enter key: ");
            strncpy(tkey1,akey,sizeof(tkey1));
            akey = getpass("Enter key again: ");
            strncpy(tkey2,akey,sizeof(tkey2));
            if(strncmp(tkey1,tkey2,sizeof(tkey1)) != 0){
                fprintf(stderr,"Key mistyped, try again\n");
            } else
                break;
        }
        akey = tkey1;
    }
    MD5Init(&mdcontext);
    MD5Update(&mdcontext,akey,strlen(akey));
    MD5Final(&mdcontext);
    memcpy(key,mdcontext.digest,16);
    memcpy(key+16,mdcontext.digest,8);

    /* Blot out original key */
    memset(akey,0,strlen(akey));

    des3key(ks,key,!encrypt);

    /* Initialize IV to all zeros */
    memset(iv,0,8);

    return ( encrypt ? doencrypt(ks,cbc,iv,stdin,stdout)
    : dodecrypt(ks,cbc,iv,stdin,stdout) );
}
/* Encrypt standard input to standard output */
int
doencrypt(DES3_KS ks,int cbc,char iv[8],FILE *in,FILE *out)
{
    char work[8];
    int cnt,i;

    for(;;){
        if((cnt = fread(work,1,8,in)) != 8){
            /* Put residual byte count in the last block.
            * Note that garbage is left in the other bytes,
            * if any; this is a feature, not a bug, since it'll
            * be stripped out at decrypt time.
            */
            work[7] = cnt;
        }
        if(cbc){
            /* CBC mode; chain in last cipher word */
            memxor(work,iv,8);
        }
        des3(ks,work);    /* Encrypt block */
        if(cbc){    /* Save outgoing ciphertext for chain */
            memcpy(iv,work,8);
        }
        fwrite(work,1,8,out);
        if(cnt != 8)
            break;
    }
    return 0;
}
int
dodecrypt(DES3_KS ks,int cbc,char iv[8],FILE *in,FILE *out)
{
    char work[8],nwork[8],ivtmp[8];
    int cnt,i;

    cnt = fread(work,1,8,in);    /* Prime the pump */
    for(;;){
        if(cbc){    /* Save incoming ciphertext for chain */
            memcpy(ivtmp,work,8);
        }
        des3(ks,work);
        if(cbc){    /* Unchain block, save ciphertext for next */
            memxor(work,iv,8);
            memcpy(iv,ivtmp,8);
        }
        /* Save buffer pending next read */
        memcpy(nwork,work,8);
        /* Try to read next block */
        cnt = fread(work,1,8,stdin);
        if(cnt != 8){    /* Can "only" be 0 if not 8 */
            /* Prev block was last one, write appropriate number
            * of bytes
            */
            cnt = nwork[7];
            if(cnt < 0 || cnt > 7){
                fprintf(stderr,"Corrupted file or wrong key\n");
            } else if(cnt != 0)
                fwrite(nwork,1,cnt,stdout);
            exit(0);
        } else {
            /* Now okay to write previous buffer */
            fwrite(nwork,1,8,out);
        }
    }
    return 0;
}
/* Convert hex/ascii nybble to binary */
int
htoa(char c)
{
    if(c >= '0' && c <= '9')
        return c - '0';
    if(c >= 'a' && c <= 'f')
        return 10 + c - 'a';
    if(c >= 'A' && c <= 'F')
        return 10 + c - 'A';
    return -1;
}
/* Convert bytes from hex/ascii to binary */
void
gethex(char *result,char *cp,int cnt)
{
    while(cnt-- != 0){
        *result = htoa(*cp++) << 4;
        *result++ |= htoa(*cp++);
    }
}
void
memxor(char *dest,char *src,int cnt)
{
    int i;

    for(i=0;i<cnt;i++)
        dest[i] ^= src[i];
}

#ifdef    DEBUG
put24(cp)
register char *cp;
{
    int i;

    for(i=0;i<24;i++){
        fprintf(stderr,"%02x ",*cp++ & 0xff);
    }
}
#endif


Jeg ved ikke helt hvordan jeg kalder den doencrypt metode rigtigt. Jeg har brug for at sende en char eller string til metoden, og få noget ulæseligt igen. Og så selvfølgelig få det dekrypteret igen. Nogen der kan hjælpe?
Avatar billede arne_v Ekspert
08. november 2006 - 04:25 #1
jeg har noget betydeligt simplere kode:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "des.h"

#define N 1000000

/*
*  arnedes3 e|d infile outfile key
*/
int main(int argc, char *argv[])
{
  FILE *infile,*outfile;
  char *buf;
  DES3_KS key;
  int len,len2,i;
  buf=(char *)malloc(N);
  memset(buf,0,N);
  /* read fdrom file */
  infile=fopen(argv[2],"rb");
  len=fread(buf,1,N,infile);
  fclose(infile);
  if(strcmp(argv[1],"e")==0)
  {
      /* encrypt */
      des3key(key,argv[4],0);
      len2=(len/8+1)*8;
      for(i=len;i<len2;i++) buf[i]=(len2-len);
      for(i=0;i<len2;i=i+8) des3(key,buf+i);
  }
  else if(strcmp(argv[1],"d")==0)
  {
      /* decrypt */
      des3key(key,argv[4],1);
      for(i=0;i<len;i=i+8) des3(key,buf+i);
      len2=len-buf[len-1];
  }
  /* write to file */
  outfile=fopen(argv[3],"wb");
  fwrite(buf,1,len2,outfile);
  fclose(outfile);
  return 0;
}
Avatar billede alex_sleiborg Nybegynder
08. november 2006 - 08:18 #2
Ja det kan jeg godt se. I mit eksempel, hvorfor indgår md5 også i krypteringen arne??? Mig bekendt laver md5, det jo om til en hash værdi, og er ikke en kryptering som sådan...
Men jeg kigger lige på dit eksempel når jeg kommer hjem
Avatar billede alex_sleiborg Nybegynder
08. november 2006 - 14:16 #3
krypterer dit eksempel ikke en fil??? Det er kun en char jeg skal have krypteret
Avatar billede arne_v Ekspert
09. november 2006 - 01:08 #4
jo

men det er jo

læs fra fil ind i buffer
krypter eller dekrypter
skriv buffer til fil

hvis du har en buffer kan du skippe læs og skriv delen
Avatar billede arne_v Ekspert
09. november 2006 - 01:11 #5
jeg tror iøvrigt at din kode og min kode bruger 2 forskellige varianter af 3DES
(EBC versus CBC)
Avatar billede alex_sleiborg Nybegynder
09. november 2006 - 08:14 #6
Jeps, jeg tror du har ret i at vi bruger 2 forskellige varianter at 3des. Min 3des.h indeholder ikke andet end 10 linjers kode, så er der så adskillige andre source filer den er afhængig af istedet. Hvor kan jeg finde din version af 3des henne af??? Smid et svar Arne
Avatar billede arne_v Ekspert
10. november 2006 - 03:33 #7
jeg har en des-portable.tar som jeg engang har fundet et eller andet sted ...

lidt googling siger at det er den her

http://www.ka9q.net/code/des/des-ka9q-1.0-portable.tar.gz
Avatar billede alex_sleiborg Nybegynder
10. november 2006 - 08:50 #8
Den du linker til er også den jeg har. Den main3.c der er i den tar fil, er den jeg postede øverst i spørgsmålet... Men jeg prøver lige at se om jeg ikke kan få det til at virke, det kan vel ikke være så svært igen
Avatar billede arne_v Ekspert
10. december 2006 - 01:09 #9
har du fået det til at virke ?
Avatar billede alex_sleiborg Nybegynder
11. december 2006 - 09:11 #10
Yes, sorry jeg først får svaret nu, men har haft voldsomt travlt. Smid et svar Arne. Og mange tak for hjælpen
Avatar billede arne_v Ekspert
11. december 2006 - 15:08 #11
ok
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