Skip to content

Instantly share code, notes, and snippets.

@redgosho
Last active June 13, 2016 03:10
Show Gist options
  • Save redgosho/10933840eea1b770f5530ccd33931e3d to your computer and use it in GitHub Desktop.
Save redgosho/10933840eea1b770f5530ccd33931e3d to your computer and use it in GitHub Desktop.
RSA暗号 p,q,dを自分で入力するタイプ。
#include <stdio.h>
int bainari(int e_10to2,int n,int m)
{
int num_2[200],amari,count,i=0,bi,bi1,ri,ri1;
while(e_10to2 >= 1){
amari = e_10to2 % 2;
e_10to2 = e_10to2 / 2;
num_2[i] = amari;
i++;
}num_2[i] = 0;
num_2[i] = 0;
count = i - 1;
bi1 = m;
bi = m;
ri1 = 1;
for (int k = 0; k <= count; k++)
{
if(k == 0 && num_2[k] == 1){
ri = bi * ri1 % n;
ri1 = ri;
bi1 = bi;
}else if(k == 0 && num_2[k] == 0){
bi = bi1 * bi1 % n;
ri1 = ri;
bi1 = bi;
}else if(num_2[k] == 0){
bi = bi1 * bi1 % n;
ri1 = ri;
bi1 = bi;
}else{
bi = bi1 * bi1 % n;
ri = bi * ri1 % n;
ri1 = ri;
bi1 = bi;
}
}
return ri;
}
int yukuri(int modafter,int ddd){
int gi,gi1,gi2,ri,ri1,ri2,ti,ti1=1,ti2=0;
gi2 = 0;
ri2 = modafter;
gi1 = modafter / ddd;
ri1 = ddd;
do{
ri = ri2 - gi1 * ri1;
ti = ti2 - gi1 * ti1;
gi = ri1 / ri;
gi2 = gi1;
gi1 = gi;
ri2 = ri1;
ri1 = ri;
ti2 = ti1;
ti1 = ti;
}while(ri != 1);
ti = modafter + ti;
return ti;
}
int main()
{
int p,q,d,n,e,m,modafter,c,search,flag;
printf("秘密鍵p(素数)を入力\n>>");
scanf("%d",&p);
printf("秘密鍵q(素数)を入力\n>>");
scanf("%d",&q);
printf("秘密鍵d(整数)を入力\n>>");
scanf("%d",&d);
printf("秘密鍵:p->%d,q->%d,d->%d\n",p,q,d);
modafter = (p-1)*(q-1);
e = yukuri(modafter,d);
n = p * q;
printf("公開鍵:n->%d,e->%d\n",n,e );
do{
printf("暗号化したいときは「0」を\n復号したい時は「1」を入力\n>>");
scanf("%d",&search);
if(search == 0){
printf("暗号化したい数字を入力\n>>");
scanf("%d",&m);
c = bainari(e,n,m);
printf("暗号化:c->%d\n\n",c );
printf("まだ暗号化、復号を続けたい場合は「1」を\n終了する場合はそれ以外の数字を入力\n>>");
scanf("%d",&flag);
}else if(search == 1){
printf("復号したい数字を入力\n>>");
scanf("%d",&c);
m = bainari(d,n,c);
printf("復号結果:m->%d\n\n",m );
printf("まだ暗号化、復号を続けたい場合は「1」を\n終了する場合はそれ以外の数字を入力\n>>");
scanf("%d",&flag);
}else{
printf("「0」か「1」を入力してください。\n");
flag = 1;
}
}while(flag == 1);
printf("終了\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment