// return random prime p // length of p is bits // p = 3 mod 4 // generate safe prime that is: p = 2*q + 1, q is prime too Integer Commiter::gen_prime(unsigned bits) { PrimeAndGenerator gen_p(1, common::rng(), bits); Integer res = gen_p.Prime(); // sanity check p = 3 mod 4 if (res % 4 != 3) { throw SanityException("gen prime"); } return res; }
int main(int argc, char *argv[]){ int keybits = 0; int choice = 0; int mod = 0; int txtpos = argc - 1; // argc-1 is because argc is base 1, argv is base 0...and we don't know how many arguments we'll get. char *text = NULL; if((strlen(argv[txtpos]) < 1) || (argc == 1)){ printf("Usage:\n%s -h\n", argv[0]); return 0; } text = (char*)malloc(sizeof(char) * strlen(argv[txtpos]) + 1); while((choice = getopt(argc, argv, "k:m:h")) != -1){ switch(choice){ case 'k': keybits = atoi(optarg); break; case 'm': mod = atoi(optarg); break; case 'h': default: printf("\t ZKEY v0.1\n\n"); printf("Usage: %s <args> <text>\n\n", argv[0]); printf("ARGS:\n"); printf("-k ###: Key length in bits for encryption\n"); printf("-m ###: Key length for cipher encrypting and decrypting\n"); printf("text: Any text that you want encrypted and sent to someone else\n\n"); printf("For -k, valid values are 1024, 4096 and 8192\n"); printf("For -m, valid values are 26, 52 and 94\n\n"); printf("Program is released as is.\n"); break; } } // This could be a goto, but trying to stay away from that. if(!keybits || !mod){ free(text); return 0; } sprintf(text, "%s", argv[txtpos]); if((keybits != 1024) && (keybits != 2048) && (keybits != 8192)){ printf("Keybit length of %d is invalid.\n", keybits); return 0; } if((MODULO != 26) && (MODULO != 52) && (MODULO != 94)){ printf("Modulo value %d is invalid.\n", MODULO); return 0; } else MODULO = mod; gen_p(keybits); free(text); return 0; }