Skip to content

Instantly share code, notes, and snippets.

@ScratchyCode
Created November 24, 2022 20:04
Show Gist options
  • Save ScratchyCode/0c0ac13b970d4af2a9019ebe217b4107 to your computer and use it in GitHub Desktop.
Save ScratchyCode/0c0ac13b970d4af2a9019ebe217b4107 to your computer and use it in GitHub Desktop.
Cifrario a permutazioni pseudocasuali
// Coded by ScratchyCode
// Cifrario a permutazioni pseudocasuali in stile CR4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#define LIM 10000
int main(){
unsigned long long int i, index, pim=0, codifica=0;
char *messaggio = (char *)calloc(LIM,sizeof(char));
char *messaggio_anagrammato = (char *)calloc(LIM,sizeof(char));
char *passwd = (char *)calloc(LIM,sizeof(char));
// input
printf("Menu:\n 1) Codificare\n 2) Decodificare\nInserisci il numero della scelta: ");
scanf("%llu",&codifica);
if(codifica != 1 && codifica !=2){
printf("Scelta non valida!\nExit...\n");
exit(0);
}
getchar();
printf("Inserisci il messaggio: ");
fgets(messaggio,LIM,stdin);
messaggio[strlen(messaggio)-1] = '\0'; // perchè salva anche il char '\n' per ultimo
printf("Inserisci la password: ");
fgets(passwd,LIM,stdin);
passwd[strlen(passwd)-1] = '\0';
printf("Inserisci il codice PIN: ");
scanf("%llu",&pim);
// calcolo un seed a partire dalla password
unsigned long long int seed = 0;
for(i=0; i<strlen(passwd); i++){
seed += passwd[i];
}
// inizializzo la sequenza caratteristica e calcolo un transiente con il codice PIM (in analogia a veracrypt)
srand(seed);
for(i=0; i<pim; i++){
rand();
}
bool *mask = calloc(strlen(messaggio),sizeof(bool));
// calcolo anagramma
for(i=0; i<strlen(messaggio); i++){
// scambio l'ordine delle lettere
index = rand() % strlen(messaggio);
// quando questo index è già preso ne cerco un altro
while(mask[index] == 1){
index = rand() % strlen(messaggio);
}
mask[index] = 1;
// codifica o decodifica
if(codifica == 1){
messaggio_anagrammato[i] = messaggio[index];
}else if(codifica == 2){
messaggio_anagrammato[index] = messaggio[i];
}
}
// scrittura anagramma
fprintf(stderr,"\nAnagramma:\n%s\n",messaggio_anagrammato);
free(messaggio);
free(passwd);
free(mask);
free(messaggio_anagrammato);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment