NTLの使い方
Posted: 2015年12月06日(日) 22:59
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM 10
int get_rand(void);
int get_prime(int sum);
void print_suretu(const char *title, const int *kakunou, int num);
int gcd(int a, int b);
int inverse(int a, int b);
int main(void)
{
int i, sum;
int kakunou[NUM], newkakunou[NUM], suretu;
int x, y, xmody;
srand((unsigned int)time(NULL));
sum = 0;
for (i = 0; i < NUM; i++)
{
suretu = sum + get_rand();
sum = sum + suretu;
kakunou[i] = suretu;
printf("%d\n",sum);
}
x = get_prime(sum);
while (1) {
printf("y の値は? "); scanf("%d", &y);
if (gcd(x, y) == 1) break;
printf("x と y が互いに素ではありません。\n");
}
for (i = 0; i < NUM; i++)
{
newkakunou[i] = kakunou[i] * xmody;
newkakunou[i] = (long long)kakunou[i] * y % x;
}
print_suretu("秘密鍵: ", kakunou, NUM);
printf("合計 = %d, x = %d, y = %d\n", sum, x, y);
print_suretu("公開鍵: ", newkakunou, NUM);
printf("暗号%d",newkakunou[2]+newkakunou[5]+newkakunou[9]);
xmody = newkakunou[2]+newkakunou[5]+newkakunou[9];
printf("暗号: %d\n", xmody);
xmody = (long long)xmody * inverse(y, x) % x;
printf("復号:");
for (i = NUM; --i >= 0; ) {
if (xmody >= kakunou[i]) {
xmody -= kakunou[i];
printf(" [%d]", i);
}
}
printf("\n");
return 0;
}
int get_rand(void)
{
return rand() % 10 + 1;
}
int get_prime(int sum)
{
int x;
printf("数列の項の合計 = %d\n", sum);
for (;;)
{
printf("x の値は? ");
if (scanf("%d",&x) != 1)
{
exit(1);
}
if (x >= sum)
return x;
else
puts("数列の合計値よりxが小さいです。");
}
}
void print_suretu(const char *title, const int *kakunou, int num)
{
int i;
for (i = 0; i < num; i++)
{
printf("%s%d", i == 0 ? title : ", ", kakunou[i]);
}
putchar('\n');
}
int gcd(int a, int b)
{
int r;
while (b)
r = a % b, a = b, b = r;
return a;
}
int inverse(int a, int b)
{
int x1 = 1, y1 = 0, z1 = a, x2 = 0, y2 = 1, z2 = b, q, t;
while (z2 > 1)
#define STEP(a, b) (t = a - q * b, a = b, b = t)
q = z1 / z2, STEP(x1, x2), STEP(y1, y2), STEP(z1, z2);
return x2 < 0 ? x2 + b : x2;
}
これをNTLでうまく実装させたいのですがどの部分を直せばいいでしょうか?
またCとC++の違いがよくわからないのですがcoutと言うのはC++関数なのでしょうか?NTLのオリジナル?の関数なのでしょうか?