int modular_exponentiation(int base,int exp,int mod) { if (exp == 0) return 1; else if (exp%2 == 0) { int mysqrt = modular_exponentiation(base, exp/2, mod); return (mysqrt*mysqrt)%mod; } else return (base * modular_exponentiation(base, exp-1, mod))%mod; }
void modexp (modexp_t *args) { modular_exponentiation (args->base, args->power, args->modulus); /* Later: return modular_exponentiation (args->base, args->power, args->modulus); */ }
extern void decrypt (int code[], unsigned char msg[]) { int i = 0; /* Laufvariable */ int n = get_rsa_module (); /* Gemeinsames Modul */ int d = get_secret_exponent (); /* Geheimer Exponent */ while (code[i] != -1) { msg[i] = (unsigned char)modular_exponentiation (code[i], d, n); i++; } msg[i] = '\0'; }
extern void encrypt (unsigned char msg[], int code[]) { int i = 0; /* Laufvariable */ int n = get_rsa_module (); /* Gemeinsames Modul */ int e = get_public_exponent (); /* Öffentlicher Exponent */ while (msg[i] != '\0') { code[i] = modular_exponentiation (msg[i], e, n); i++; } code[i] = -1; }
int * split_number(int number, int n, int t) { int * shares = malloc(sizeof(int)*n); int coef[t]; int x; int i; coef[0] = number; for (i = 1; i < t; ++i) { #if defined (HAVE_ARC4RANDOM) coef[i] = arc4random_uniform(prime - 1); #else coef[i] = rand() % (prime - 1); #endif } for (x = 0; x < n; ++x) { int y = coef[0]; for (i = 1; i < t; ++i) { int temp = modular_exponentiation(x+1, i, prime); y = (y + (coef[i] * temp % prime)) % prime; } y = (y + prime) % prime; shares[x] = y; } return shares; }
int main(void) { char _1_main_$locals[168] ; union _1_main_$node _1_main_$stack[1][32] ; union _1_main_$node *_1_main_$sp[1] ; unsigned char *_1_main_$pc[1] ; { megaInit(); _1_main_$sp[0] = _1_main_$stack[0]; _1_main_$pc[0] = _1_main_$array[0]; while (1) { switch (*(_1_main_$pc[0])) { case _1_main__store_int$left_STA_0$right_STA_1: (_1_main_$pc[0]) ++; *((int *)(_1_main_$sp[0] + 0)->_void_star) = (_1_main_$sp[0] + -1)->_int; _1_main_$sp[0] += -2; break; case _1_main__store_long_long$right_STA_0$left_STA_1: (_1_main_$pc[0]) ++; *((long long *)(_1_main_$sp[0] + -1)->_void_star) = (_1_main_$sp[0] + 0)->_long_long; _1_main_$sp[0] += -2; break; case _1_main__goto$label_LAB_0: (_1_main_$pc[0]) ++; _1_main_$pc[0] += *((int *)_1_main_$pc[0]); break; case _1_main__label$label_LAB_0: (_1_main_$pc[0]) ++; break; case _1_main__constant_long_long$result_STA_0$value_LIT_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 1)->_long_long = *((long long *)_1_main_$pc[0]); (_1_main_$sp[0]) ++; _1_main_$pc[0] += 8; break; case _1_main__load_long_long$left_STA_0$result_STA_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 0)->_long_long = *((long long *)(_1_main_$sp[0] + 0)->_void_star); break; case _1_main__store_void_star$left_STA_0$right_STA_1: (_1_main_$pc[0]) ++; *((void **)(_1_main_$sp[0] + 0)->_void_star) = (_1_main_$sp[0] + -1)->_void_star; _1_main_$sp[0] += -2; break; case _1_main__call$func_LIT_0: (_1_main_$pc[0]) ++; switch (*((int *)_1_main_$pc[0])) { case 2: scanf(*((char const * __restrict *)(_1_main_$locals + 32)), *((int **)(_1_main_$locals + 40)), *((int **)(_1_main_$locals + 56))); break; case 1: scanf(*((char const * __restrict *)(_1_main_$locals + 0)), *((int **)(_1_main_$locals + 8))); break; case 3: scanf(*((char const * __restrict *)(_1_main_$locals + 72)), *((int **)(_1_main_$locals + 80)), *((int **)(_1_main_$locals + 96))); break; case 4: *((long long *)(_1_main_$locals + 144)) = modular_exponentiation(*((long long *)(_1_main_$locals + 112)), *((long long *)(_1_main_$locals + 120)), *((long long *)(_1_main_$locals + 128))); break; case 6: printf(*((char const * __restrict *)(_1_main_$locals + 152)), *((long long *)(_1_main_$locals + 160))); break; case 5: test(); break; } _1_main_$pc[0] += 4; break; case _1_main__branchIfTrue$expr_STA_0$label_LAB_0: (_1_main_$pc[0]) ++; if ((_1_main_$sp[0] + 0)->_int) { _1_main_$pc[0] += *((int *)_1_main_$pc[0]); } else { _1_main_$pc[0] += 4; } (_1_main_$sp[0]) --; break; case _1_main__return_int$expr_STA_0: (_1_main_$pc[0]) ++; return ((_1_main_$sp[0] + 0)->_int); break; case _1_main__MinusA_int_int2int$left_STA_0$result_STA_0$right_STA_1: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + -1)->_int = (_1_main_$sp[0] + 0)->_int - (_1_main_$sp[0] + -1)->_int; (_1_main_$sp[0]) --; break; case _1_main__convert_int2long_long$left_STA_0$result_STA_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 0)->_long_long = (long long )(_1_main_$sp[0] + 0)->_int; break; case _1_main__constant_int$result_STA_0$value_LIT_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 1)->_int = *((int *)_1_main_$pc[0]); (_1_main_$sp[0]) ++; _1_main_$pc[0] += 4; break; case _1_main__convert_void_star2void_star$left_STA_0$result_STA_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 0)->_void_star = (_1_main_$sp[0] + 0)->_void_star; break; case _1_main__local$result_STA_0$value_LIT_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 1)->_void_star = (void *)(_1_main_$locals + *((int *)_1_main_$pc[0])); (_1_main_$sp[0]) ++; _1_main_$pc[0] += 4; break; case _1_main__string$result_STA_0$value_LIT_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 1)->_void_star = (void *)(_1_main_$strings + *((int *)_1_main_$pc[0])); (_1_main_$sp[0]) ++; _1_main_$pc[0] += 4; break; case _1_main__PlusA_long_long_long_long2long_long$left_STA_0$result_STA_0$right_STA_1: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + -1)->_long_long = (_1_main_$sp[0] + 0)->_long_long + (_1_main_$sp[0] + -1)->_long_long; (_1_main_$sp[0]) --; break; case _1_main__load_int$left_STA_0$result_STA_0: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + 0)->_int = *((int *)(_1_main_$sp[0] + 0)->_void_star); break; case _1_main__Ge_long_long_long_long2int$left_STA_0$result_STA_0$right_STA_1: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + -1)->_int = (_1_main_$sp[0] + 0)->_long_long >= (_1_main_$sp[0] + -1)->_long_long; (_1_main_$sp[0]) --; break; case _1_main__Mod_long_long_long_long2long_long$left_STA_0$result_STA_0$right_STA_1: (_1_main_$pc[0]) ++; (_1_main_$sp[0] + -1)->_long_long = (_1_main_$sp[0] + 0)->_long_long % (_1_main_$sp[0] + -1)->_long_long; (_1_main_$sp[0]) --; break; } } } }