// 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;
}
示例#2
0
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;
}