[Lugge] Re: R: Re: R: generare numeri casuali in c usando /dev/random o /dev/urandom

  • From: Marco Antonietti <marco.antonietti@xxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Thu, 03 Feb 2005 19:11:31 +0000

gianlu]{a wrote:

Okkio però, dai uno sguardo al file in uscita e capirai cosa vuol dire
sequenza ripetibile!
Ovviamente questo generatore si può migliorare con qualche accorgimento,
vedi seme iniziale diverso da 1 ecc.


infatti ho visto genera una serie di numeri e poi li ripete...

Se hai domande son qui.



ho fatto una cosa del genere:
//begin
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int randomseed(void){
        int randnum;
        int fd = open("/dev/urandom", O_RDONLY);
        if (fd != -1) {
           read(fd,&randnum,4);
           randnum = abs(randnum);
        }
        close(fd);
        return randnum;
}

int main(int argc, char *argv[]){
srand(randomseed());
int k,i,rndmatrix[16],rndindex;
FILE *out;
out=fopen("random001","w");
for(i=0; i<100; i++) {
fprintf(out,"%d\n",rand()%255); //qui genero i numeri usando solo srand()
}
fclose(out);
out=fopen("random002","w");
for(i=0; i<100; i++) {
for(k=0;k<16;k++){
rndmatrix[k]=rand()%255; //qui genero i numeri creando un array contenente i valori
} //e poi genero un indice dell'array random, così dovrei
//simulare una sorta di "estrazione"
rndindex=rand()%16;
fprintf(out,"%d\n",rndmatrix[rndindex]);
}
fclose(out);
printf("Done");
return EXIT_SUCCESS;
}
//end


boh non so se ho aftto una cosa sensata... pensavo di simulare una estrazione un po come quando nella tombola si estraggono i numeri :)

comunque lo scopo è quello di generare una chiave per crittografare con exor bit a bit...
sto cercando di imparare alcune cose molto interessanti del c.


il codice del programmino è questo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#define RNDMATRIX 16

void genhelp(char *errore){
if(errore!=""){
printf("Utility crittografia One Time Pad, Errore:\n");
printf("%s, utilizzo del programma:\n\n",errore); }
else {
printf("Utility crittografia One Time Pad, utilizzo del programma:\n\n");
} printf("-crittografare: otp encnokey [cifrare ] [chiave] [cifrato ]\n");
printf("-crittografare: otp enc [cifrare ] [chiave] [cifrato ]\n");
printf("-decrittografare: otp dec [decifrare] [chiave] [decifrato]\n\n");
printf("utilizzando encnokey non viene generata la chiave, utilizza una\n");
printf("chiave gia' esistente, utile per una codifica multipla:\n\n");
printf("otp enc [sorgente] [chiave1] [crittografato1]\n");
printf("otp enc [crittografato1] [chiave2] [crittografato2]\n");
printf("otp encnokey [crittografato2] [chiave1] [crittografato]\n");
}


int randomseed(void){
int randnum;
int fd = open("/dev/urandom", O_RDONLY);
if (fd != -1) {
read(fd,&randnum,4);
randnum = abs(randnum); }
close(fd);
return randnum;
}


void genkey(char *nfkey, int len) {
 int i, k, rndnums[RNDMATRIX], rndindex;
 FILE *keyfile;
 keyfile=fopen(nfkey,"wb");
 for(i=0; i<len; i++) {
     for(k=0; k<RNDMATRIX; k++){
        rndnums[k]=rand()%255;
     }
     rndindex=rand()%RNDMATRIX;
     fputc(rndnums[rndindex],keyfile);
 }
 fclose(keyfile);
}

int lenkey(char *filename){
   FILE *f2read;
   int chrc=0;
   char tmpc;
   f2read=fopen(filename,"rb");
   while(!feof(f2read)){
       tmpc=getc(f2read);
       chrc++;
   }
   fclose(f2read);
   return chrc-1;
}

void enc(char *source, char *key, char *outfile){
   int chria, chrib;
   char tmpc;
   FILE *fsrc, *fkey, *fout;
   fsrc=fopen(source,"rb");
   fkey=fopen(key,"rb");
   fout=fopen(outfile,"wb");
   while(!feof(fsrc)){
       tmpc=getc(fsrc);
       chria=tmpc;
       tmpc=getc(fkey);
       chrib=tmpc;
       if(chrib!=-1) fputc(chria ^ chrib,fout);
   }
   fclose(fsrc);
   fclose(fkey);
   fclose(fout);
}


int main(int argc, char *argv[]){
FILE *ftest; int lenbuff, rndseed;


 rndseed=randomseed();
 srand(rndseed);

 if(argc<5 || !strcmp(argv[1],"-help") || !strcmp(argv[1],"-h")) {
     genhelp("");
     exit(0);
 }

if (!strcmp(argv[1],"enc") || !strcmp(argv[1],"dec") || !strcmp(argv[1],"encnokey")){
if (!strcmp(argv[1],"encnokey")){
ftest=fopen(argv[2],"r");
if(ftest==NULL){
genhelp("File da crittografare inesistente");
exit(1);
}
fclose(ftest);
ftest=fopen(argv[3],"r");
if(ftest==NULL){
genhelp("File chiave inesistente");
exit(1);
}
fclose(ftest);
enc(argv[2],argv[3],argv[4]);
}
if (!strcmp(argv[1],"enc")){
ftest=fopen(argv[2],"r");
if(ftest==NULL){
genhelp("File da crittografare inesistente");
exit(1);
}
fclose(ftest);
lenbuff=lenkey(argv[2]);
genkey(argv[3],lenbuff);
enc(argv[2],argv[3],argv[4]);
}
if (!strcmp(argv[1],"dec")){
ftest=fopen(argv[2],"r");
if(ftest==NULL){
genhelp("File da decrittografare inesistente");
exit(1);
}
fclose(ftest);
ftest=fopen(argv[3],"r");
if(ftest==NULL){
genhelp("File chiave inesistente");
exit(1);
}
fclose(ftest);


       enc(argv[2],argv[3],argv[4]);
    }
 }
 else {
     genhelp("");
     exit(1);
 }
 return 0;
}

in ogni caso vedo che ho ancora molto da imparare :)


-- One Love!

public key on keyserver:
http://keyserver.linux.it/pks/lookup?op=index&exact=on&search=marleylandia
http://keyserver.linux.it/pks/lookup?op=index&exact=on&search=marco.antonietti


Other related posts: