初心者です。暗号化のプログラムを作っています。その中で、mのe乗を求めたいのですが正確な値が出ません。それよりも前の部分は正常に動いています。/暗号化/という部分です。どこを直せば良いのでしょうか。
c
1 #include<stdio.h> 2#include <stdlib.h> // rand, srand関数 3#include <time.h> // time関数 4#include <math.h> 5 6int gcd(int x, int y); // 最大公約数を求める関数 7 8 9 10 11 12int main(void){ 13 14 unsigned long long int p=0,q=0; 15 int i,l;//繰り返し用変数 16 int flag1=0,flag2=0; 17 int count=0; 18 unsigned long long int n; 19 unsigned long long int o;//オイラー関数 20 unsigned long long int E; 21 unsigned long long int num=0; 22 int x,y,r;//ユーグリッドの互除法で使う 23 int gcd_num=0;//最大公約数 24 unsigned long long int d=0; 25 unsigned long long int judge , k=0;//dを求める時に必要,dはあまり 26 unsigned long long int c; 27 int m=0;//平文 28 unsigned long long int me=0;//mのe乗 29 30 31 srand((unsigned int)time(NULL)); // 現在時刻の情報で初期化 32 33 /*pの値を求める*/ 34 while(p<1000 || flag1==1 || p==0){//pの条件を満たしてない限り繰り返す 35 flag1=0; 36 p=rand()%10000;//以降の計算に時間がかかるため4桁に指定 37 for( l=2;l<p;++l ) { 38 if( p%l==0 ) {//割りきれる場合 39 flag1 = 1; 40 break;//繰り返し終了 41 } 42 } 43 } 44 printf("p:%llu\n",p);//pの値出力 45 46 /*qの値を求める*/ 47 while(q<1000 || flag2==1 || q==0){//qの条件を満たしてない限り繰り返す 48 flag2=0; 49 q=rand()%10000;//以降の計算に時間がかかるため4桁に指定 50 for( i=2;i<q;++i ) { 51 if( q%i==0 ) {//割りきれる場合 52 flag2 = 1; 53 break;//繰り返し終了 54 } 55 } 56 } 57 printf("q:%llu\n",q);//qの値出力 58 59 n=p*q; 60 61 o=(p-1)*(q-1);//オイラー関数 62 printf("φ:%llu\n",o); 63 64 /*eの値を求める*/ 65 while(gcd_num!=1 || E==0 ||E==1){ 66 E=rand()%100; 67 68 if(o<=E){//E,oのうち大きい方をx小さい方をyに設定 69 x=E; 70 y=o; 71 } 72 else{ 73 y=E; 74 x=o; 75 } 76 gcd_num = gcd(x, y); 77 } 78 printf( "e:%llu\n", E ); 79 80 81 /*dの値を求める*/ 82 while(judge!=0 || d>o ){ 83 d=rand()%99960004;//φの範囲:0~9998*9998 84 judge=(E*d-1)%o; 85 } 86 printf( "d:%llu\n", d ); 87 k=(E*d-1)/o; 88 89 printf("k:"); 90 if(E*d==k*o+1){//ed=φk+1か確認 91 printf("%llu\n", k ); 92 } 93 94 /*暗号化*/ 95 while(m==0){ 96 m=rand()%10;//mは2桁 97 } 98 printf("m:%d\n",m); 99 me=m*m; 100 for(i=1;i<E-1;i++){ 101 me=me*m; 102 } 103 printf("m^e:%llu\n", me ); 104 c=me%n; 105 printf("c:%llu\n",c); 106 107 108 109 110 return 0; 111} 112 113 114// 最大公約数を求める関数 115int gcd(int x, int y){ 116 int r; 117 118 119 // ユーグリッドの互除法 120 while((r = x % y) != 0) { // 割り切れるまでループ 121 x = y; 122 y = r; 123 } 124 return y; 125} 126 127 128 129 130
回答3件
あなたの回答
tips
プレビュー