Esempio n. 1
0
/**
 * Encode the message of given length, using the public key (exponent, modulus)
 * The resulting array will be of size len/bytes, each index being the encryption
 * of "bytes" consecutive characters, given by m = (m1 + m2*128 + m3*128^2 + ..),
 * encoded = m^exponent mod modulus
 */
bignum *encodeMessage(int len, int bytes, char *message, bignum *exponent, bignum *modulus) {
    /* Calloc works here because capacity = 0 forces a realloc by callees but we should really
     * bignum_init() all of these */
    int i, j;
    bignum *encoded = calloc(len/bytes, sizeof(bignum));
    bignum *num128 = bignum_init(), *num128pow = bignum_init();
    bignum *x = bignum_init(), *current = bignum_init();
    bignum_fromint(num128, 128);
    bignum_fromint(num128pow, 1);
    for(i = 0; i < len; i += bytes) {
        bignum_fromint(x, 0);
        bignum_fromint(num128pow, 1);
        /* Compute buffer[0] + buffer[1]*128 + buffer[2]*128^2 etc (base 128 representation for characters->int encoding)*/
        for(j = 0; j < bytes; j++) {
            bignum_fromint(current, message[i + j]);
            bignum_imultiply(current, num128pow);
            bignum_iadd(x, current); /*x += buffer[i + j] * (1 << (7 * j)) */
            bignum_imultiply(num128pow, num128);
        }
        encode(x, exponent, modulus, &encoded[i/bytes]);
#ifndef NOPRINT
        bignum_print(&encoded[i/bytes]);
        printf(" ");
#endif
    }
    return encoded;
}
int main (void) {
	bignum_t * prime = bignum_pow (2, 7830457, DIGITS_TO_CONSIDER);

	prime = bignum_mult_to (prime, 28433);
	prime = bignum_add_to (prime, bignum_get (1));

	prime->used = DIGITS_TO_CONSIDER;
	bignum_print (prime);

	bignum_delete (prime);

	return 0;
}
Esempio n. 3
0
/*
 * MAIN: Run the program and tests your functions.
 * sample command: ./bignum 4 12 + 13
 * Result: 31
 */
int main(int argc, char** argv) {

	int input_base;

    int* input1;
    int* input2;
    int* result;

	if(argc != 5) { 
		print_usage(argv[0]); 
	}

	input_base = string_to_integer(argv[1]);

	if(!valid_base(input_base)) { 
		fprintf(stderr, "Invalid base: %s\n", argv[1]);
		print_usage(argv[0]);
	}
	

	if(!valid_input(argv[2], input_base)) { 
		fprintf(stderr, "Invalid input1: %s\n", argv[2]);
		print_usage(argv[0]);
	}

	if(!valid_input(argv[4], input_base)) { 
		fprintf(stderr, "Invalid input2: %s\n", argv[4]);
		print_usage(argv[0]);
	}

	if(argv[3][0] != '-' && argv[3][0] != '+') {
		fprintf(stderr, "Invalid operation: %s\n", argv[3]);
		print_usage(argv[0]);
	}

	input1 = string_to_integer_array(argv[2]);
	input2 = string_to_integer_array(argv[4]);

	result = perform_math(input1, input2, argv[3][0], input_base);

	printf("Result: ");
	bignum_print(result);

	printf("\n");
	exit(0);
}
Esempio n. 4
0
File: 10334.c Progetto: treblih/oj
int main(int argc, const char *argv[])
{
#ifdef DB
	fp = fopen("input", "r");
#endif
	int i, idx;
	int digits = 1;
	fibo[0].arr[0] = 1;
	fibo[1].arr[0] = 2;
	for (i = 2; i <= 5000; ++i) {
		digits = bignum_add(i, digits);
	}
	while (scanf("%d", &idx) != EOF) {
		if (!idx) {puts("1"); continue;}
		bignum_print(idx);
		putchar('\n');
	}
	return 0;
}
Esempio n. 5
0
int main(int argc, const char * argv[]) {
    
    char *p=(char*)malloc(BUF_SIZE*sizeof(char));
    printf("\n请输入选择的大素数p:\n");
    scanf("%s",p);
    bignum *p1 = bignum_init();
    bignum_fromstring(p1, p);
    free(p);
    if(probablePrime(p1, ACCURACY))
    {
        printf("p合理");
        bignum *yz = bignum_init();
        bignum_fromint(yz, 3);
        if (bignum_equal(yz,p1)) {
            printf("但p太小不适用!\n");
            return 1;
        }
    }else{
        printf("p不是素数!\n");
        return 1;
    }
    bignum *p2 = bignum_init();
    bignum *temp = bignum_init();
    bignum_fromint(temp, 1);
    bignum_subtract(p2, p1, temp);
    printf("\n请输入选择的本原元α:\n");
    char *a=(char*)malloc(BUF_SIZE*sizeof(char));
    scanf("%s",a);
    bignum *a1 = bignum_init();
    bignum_fromstring(a1, a);
    free(a);
    printf("\n请输入选择的随机整数d:(2<=d<=p-2)\n");
    char *d=(char*)malloc(BUF_SIZE*sizeof(char));
    scanf("%s",d);
    bignum *d1 = bignum_init();
    bignum_fromstring(d1, d);
    free(d);
    bignum *yz0 = bignum_init();
    bignum_fromint(yz0, 2);
    bignum *yz1 = bignum_init();
    bignum_subtract(yz1, p1, yz0);
    if( (bignum_greater(d1, yz0)||bignum_equal(d1, yz0))&&(bignum_greater(yz1,d1)||bignum_equal(yz1,d1)) )
    {
        printf("d合理");
    }else{
        printf("d不合要求!\n");
        return 1;
    }
    printf("\n请输入您的消息x:\n");
    char *x=(char*)malloc(BUF_SIZE*sizeof(char));
    scanf("%s",x);
    bignum *x1 = bignum_init();
    bignum_fromstring(x1, x);
    free(x);
    printf("\n请输入您选择的k:(2<=k<=p-2且k应与p-1互质)\n");
    char *k=(char*)malloc(BUF_SIZE*sizeof(char));
    scanf("%s",k);
    bignum *k1 = bignum_init();
    bignum_fromstring(k1, k);
    free(k);
    if( (bignum_greater(k1, yz0)||bignum_equal(k1, yz0))&&(bignum_greater(yz1,k1)||bignum_equal(yz1,k1)) )
    {
        bignum *yz2 = bignum_init();
        bignum_gcd(k1, p2, yz2);
        if (!bignum_equal(yz2,temp)) {
            printf("k不合要求!\n");
            return 1;
        }
        printf("k合理");
    }else{
        printf("k不合要求!\n");
        return 1;
    }
    
    
    
    bignum *b1 = bignum_init();
    bignum_modpow(a1,d1,p1,b1);
    printf("\n\n所以\n您生成的公钥(p,α,β)为:\t(");
    bignum_print(p1);
    printf(",");
    bignum_print(a1);
    printf(",");
    bignum_print(b1);
    printf(")\n");
    
    printf("您的私钥为:");
    bignum_print(d1);
    printf("\n");
    printf("您发出的消息(x(r,s))为:\t(");
    bignum_print(x1);
    printf(",(");
    bignum *r1 = bignum_init();
    bignum_modpow(a1,k1,p1,r1);
    bignum_print(r1);
    printf(",");
    bignum *s1=bignum_init();
    bignum_multiply(temp, d1, r1);
    
    bignum *temp2 = bignum_init();
    bignum *x2 = bignum_init();
    bignum_copy(x1, x2);
    while (bignum_less(x2, temp)) {
        bignum *add = bignum_init();
        bignum_copy(p2, add);
        bignum_iadd(x2, add) ;
    }
    bignum_subtract(temp2, x2, temp);
//    printf("\ntemp2:");
//    bignum_print(temp2);
//    printf("\t");
//    bignum_print(x2);
//    printf("\t");
//    bignum_print(temp);
//    printf("\n");
    bignum_inverse(k1, p2, temp);//计算a的逆元result = a^-1 mod m
    bignum_multiply(s1, temp, temp2);
    bignum_imodulate(s1, p2);//source = source % modulus
    bignum_print(s1);
    printf("))\n");
    
    bignum *t0 = bignum_init();
    bignum_modpow(a1,x1,p1,t0);
    bignum *t1 = bignum_init();
    bignum_modpow(b1,r1,p1,t1);
    bignum *t2 = bignum_init();
    bignum_modpow(r1,s1,p1,t2);
    bignum *t3 = bignum_init();
    bignum_multiply(t3, t1, t2);
    bignum_imodulate(t3, p1);
    printf("按t=(α^x)mod p,结果为:");
    bignum_print(t0);
    printf("\n按t=(β^r*r^s)mod p,结果为:");
    bignum_print(t3);
    printf("\n");
    if (bignum_equal(t0, t3)) {
        printf("此签名正确有效~\n\n");
    }else{
        printf("此签名错误无效!\n\n");
    }
}
Esempio n. 6
0
/**
 * Main method to demostrate the system. Sets up primes p, q, and proceeds to encode and
 * decode the message given in "text.txt"
 */
int main(void) {
	int i, bytes, len;
	bignum *p = bignum_init(), *q = bignum_init(), *n = bignum_init();
	bignum *phi = bignum_init(), *e = bignum_init(), *d = bignum_init();
	bignum *bbytes = bignum_init(), *shift = bignum_init();
	bignum *temp1 = bignum_init(), *temp2 = bignum_init();
	
	bignum *encoded;
	int *decoded;
	char *buffer;
	FILE* f;
	
	srand(time(NULL));
	
	randPrime(FACTOR_DIGITS, p);
	printf("Got first prime factor, p = ");
	bignum_print(p);
	printf(" ... ");
	getchar();
	
	randPrime(FACTOR_DIGITS, q);
	printf("Got second prime factor, q = ");
	bignum_print(q);
	printf(" ... ");
	getchar();
	
	bignum_multiply(n, p, q);
	printf("Got modulus, n = pq = ");
	bignum_print(n);
	printf(" ... ");
	getchar();
	
	bignum_subtract(temp1, p, &NUMS[1]);
	bignum_subtract(temp2, q, &NUMS[1]);
	bignum_multiply(phi, temp1, temp2); /* phi = (p - 1) * (q - 1) */
	printf("Got totient, phi = ");
	bignum_print(phi);
	printf(" ... ");
	getchar();
	
	randExponent(phi, EXPONENT_MAX, e);
	printf("Chose public exponent, e = ");
	bignum_print(e);
	printf("\nPublic key is (");
	bignum_print(e);
	printf(", ");
	bignum_print(n);
	printf(") ... ");
	getchar();
	
	bignum_inverse(e, phi, d);
	printf("Calculated private exponent, d = ");
	bignum_print(d);
	printf("\nPrivate key is (");
	bignum_print(d);
	printf(", ");
	bignum_print(n);
	printf(") ... ");
	getchar();
	
	/* Compute maximum number of bytes that can be encoded in one encryption */
	bytes = -1;
	bignum_fromint(shift, 1 << 7); /* 7 bits per char */
	bignum_fromint(bbytes, 1);
	while(bignum_less(bbytes, n)) {
		bignum_imultiply(bbytes, shift); /* Shift by one byte, NB: we use bitmask representative so this can actually be a shift... */
		bytes++;
	}

	printf("Opening file \"text.txt\" for reading\n");
	f = fopen("text.txt", "r");
	if(f == NULL) {
		printf("Failed to open file \"text.txt\". Does it exist?\n");
		return EXIT_FAILURE;
	}
	len = readFile(f, &buffer, bytes); /* len will be a multiple of bytes, to send whole chunks */
	
	printf("File \"text.txt\" read successfully, %d bytes read. Encoding byte stream in chunks of %d bytes ... ", len, bytes);
	getchar();
	printf("\n");
	encoded = encodeMessage(len, bytes, buffer, e, n);
	printf("\n\nEncoding finished successfully ... ");
	getchar();
	
	printf("Decoding encoded message ... ");
	getchar();
	printf("\n");
	decoded = decodeMessage(len/bytes, bytes, encoded, d, n);
	printf("\n\nFinished RSA demonstration!");
	
	/* Eek! This is why we shouldn't of calloc'd those! */
	for(i = 0; i < len/bytes; i++) free(encoded[i].data);
	free(encoded);
	free(decoded);
	free(buffer);
	bignum_deinit(p);
	bignum_deinit(q);
	bignum_deinit(n);
	bignum_deinit(phi);
	bignum_deinit(e);
	bignum_deinit(d);
	bignum_deinit(bbytes);
	bignum_deinit(shift);
	bignum_deinit(temp1);
	bignum_deinit(temp2);
	fclose(f);
	
	return EXIT_SUCCESS;
}
Esempio n. 7
0
int main(void)
{
    bignum_t sum;
    int i;

    comb_init();

    timer_reset();

    for (i = 0; i < 1000; i++)
    {
        TEST_COMB_SUM("\xf3\xe7\x7f\xfe\x9f\xff\xbd\xff\x37");
        TEST_COMB_SUM("\xad\xbd\xde\xff\xfb\xff\xbb\xf7\x2d");
        TEST_COMB_SUM("\xf6\xfb\x8a\xf5\xba\xbc\x59\xb3\x0f");
        TEST_COMB_SUM("\x05\x40\x33\x02\x27\x00\x21\x87\x1e");
        TEST_COMB_SUM("\x04\x00\x81\x06\x90\x08\x00\x52\x0c");
        TEST_COMB_SUM("\x10\x0c\x08\x90\xba\x80\x12\x0b\x02");
        TEST_COMB_SUM("\xf1\xd0\xa1\x42\x82\x89\x31\x51\x3a");
        TEST_COMB_SUM("\x00\x00\x00\x00\x80\x80\x00\x00\x00");
        TEST_COMB_SUM("\xbf\xff\xff\xff\xff\xf5\xff\xff\x3f");
        TEST_COMB_SUM("\x94\x15\x90\x31\x00\x22\x40\x07\x20");
        TEST_COMB_SUM("\xaf\x1f\x0c\xa4\x54\x76\xca\xef\x16");
        TEST_COMB_SUM("\x00\x00\x00\x00\x26\x68\x04\x10\x14");
        TEST_COMB_SUM("\xbf\xf7\x1b\xdf\xd7\xb7\x5e\xff\x1a");
        TEST_COMB_SUM("\x0c\x05\xc0\xb1\x82\x7f\x9b\x9e\x1b");
        TEST_COMB_SUM("\xfb\x1b\x3b\xbf\x7c\xef\xff\x7f\x3b");
        TEST_COMB_SUM("\x06\x01\x25\x04\x00\x00\x42\x40\x02");
        TEST_COMB_SUM("\x20\x02\x00\x20\x40\x00\x08\x00\x00");
        TEST_COMB_SUM("\x68\x98\x5a\x4d\x30\xb6\x42\xd0\x2a");
        TEST_COMB_SUM("\x57\xfa\x8c\xca\xa2\xae\x13\x45\x14");
        TEST_COMB_SUM("\x40\x05\x9f\x99\x7b\x10\x00\xc1\x20");
    }

    printf("Elapsed time: %fs\n", timer_elapsed());

    timer_reset();

    for (i = 0; i < 1000; i++)
    {
        TEST_COMB_FSUM("\xf3\xe7\x7f\xfe\x9f\xff\xbd\xff\x37");
        TEST_COMB_FSUM("\xad\xbd\xde\xff\xfb\xff\xbb\xf7\x2d");
        TEST_COMB_FSUM("\xf6\xfb\x8a\xf5\xba\xbc\x59\xb3\x0f");
        TEST_COMB_FSUM("\x05\x40\x33\x02\x27\x00\x21\x87\x1e");
        TEST_COMB_FSUM("\x04\x00\x81\x06\x90\x08\x00\x52\x0c");
        TEST_COMB_FSUM("\x10\x0c\x08\x90\xba\x80\x12\x0b\x02");
        TEST_COMB_FSUM("\xf1\xd0\xa1\x42\x82\x89\x31\x51\x3a");
        TEST_COMB_FSUM("\x00\x00\x00\x00\x80\x80\x00\x00\x00");
        TEST_COMB_FSUM("\xbf\xff\xff\xff\xff\xf5\xff\xff\x3f");
        TEST_COMB_FSUM("\x94\x15\x90\x31\x00\x22\x40\x07\x20");
        TEST_COMB_FSUM("\xaf\x1f\x0c\xa4\x54\x76\xca\xef\x16");
        TEST_COMB_FSUM("\x00\x00\x00\x00\x26\x68\x04\x10\x14");
        TEST_COMB_FSUM("\xbf\xf7\x1b\xdf\xd7\xb7\x5e\xff\x1a");
        TEST_COMB_FSUM("\x0c\x05\xc0\xb1\x82\x7f\x9b\x9e\x1b");
        TEST_COMB_FSUM("\xfb\x1b\x3b\xbf\x7c\xef\xff\x7f\x3b");
        TEST_COMB_FSUM("\x06\x01\x25\x04\x00\x00\x42\x40\x02");
        TEST_COMB_FSUM("\x20\x02\x00\x20\x40\x00\x08\x00\x00");
        TEST_COMB_FSUM("\x68\x98\x5a\x4d\x30\xb6\x42\xd0\x2a");
        TEST_COMB_FSUM("\x57\xfa\x8c\xca\xa2\xae\x13\x45\x14");
        TEST_COMB_FSUM("\x40\x05\x9f\x99\x7b\x10\x00\xc1\x20");
    }

    printf("Elapsed time: %fs\n", timer_elapsed());

    timer_reset();

    for (i = 0; i < 1000000; i++)
    {
        byte comb[12];
        ((uint32_t*)comb)[0] = get_random();
        ((uint32_t*)comb)[1] = get_random();
        ((uint32_t*)comb)[2] = get_random() & ((1 << (70 - 64)) - 1);

        comb_sum(&sum, comb);
    }

    printf("Elapsed time: %fs\n", timer_elapsed());

    timer_reset();

    for (i = 0; i < 1000000; i++)
    {
        byte comb[12];
        ((uint32_t*)comb)[0] = get_random();
        ((uint32_t*)comb)[1] = get_random();
        ((uint32_t*)comb)[2] = get_random() & ((1 << (70 - 64)) - 1);

        comb_fast_sum(&sum, comb);
    }

    printf("Elapsed time: %fs\n", timer_elapsed());

    bignum_print(&sum);

    comb_free();

    return 0;
}