NTLの使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ライトニング

NTLの使い方

#1

投稿記事 by ライトニング » 5年前

コード:

#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のオリジナル?の関数なのでしょうか?

“C言語何でも質問掲示板” へ戻る