かわりにプログラミングしてください。
Posted: 2013年10月17日(木) 20:01
下が暗号化復号プログラムです。
32bitまでしか対応していなくこれを2048bit長に対応させたいです。
何がしたいのか良くわからないかと思いますが私もよく分かってません。
良くわからないものを4月からずっと抱えてきました。このままだといろいろ詰みます。
指導担当の先生が居るのですが私達の指導担当はなにも指導してくれないのです。
せめて手順みたいなものでもいいので教えて下さい、助けてください。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void swap(int a, int b);
void swap(int a, int b){
int temp;
temp=a;
a=b;
b=temp;
}
unsigned int calcGCD( unsigned int a, unsigned int b )
{
if (a<b) swap(a,b);
do {
unsigned int r=a%b;
a=b;
b=r;
} while (b!=0);
return(a);
}
unsigned int calcGCD( unsigned int a, unsigned int b, int& x, int& y )
{
x=1;
y=0;
int x1=0;
int y1=1;
int *pa,*pb;
pa=&x;
pb=&y;
if (a<b) {
swap(a,b);
swap(x,y);
swap(x1,y1);
}
do {
unsigned int q=a/b;
unsigned int r=a%b;
int x2=x-q*x1;
int y2=y-q*y1;
x=x1;
y=y1;
x1=x2;
y1=y2;
a=b;
b=r;
}while(b!=0);
return(a);
}
unsigned int main()
{
int p,q,d,e,f,g,h,i,j;
printf("Pの値は?");
scanf("%d",&p);
printf("Qの値は?");
scanf("%d",&q);
d=(p-1)*(q-1);
printf("公開鍵の値は?");
scanf("%d",&e);
f=calcGCD(d,e);//最大公約数
g=d*e/f;//最小公倍数
j=calcGCD(d,e,h,i);//ax+by=gcd
printf("最大公約数(gcd)は%d最小公倍数(lcm)は%d\n",f,g);
printf( "(%d)x + (%d)y = %d 、 x=%d, y=%d\n", d, e, f, h, i );
FILE *file;
file = fopen("test.txt","w");
fprintf(file,"最大公約数(gcd)は%d最小公倍数(lcm)は%d\n",f,g);
fprintf(file,"(%d)x + (%d)y = %d 、 x=%d, y=%d\n", d, e, f, h, i );
fclose(file);
system("PAUSE");
}
/*暗号化*/
#include<stdio.h>
#include<stdlib.h>
unsigned int power( unsigned int l, unsigned int m, unsigned int n )//(指数、底、割る数)
{
if(n>=0x10000)return(0);
if(l==0||n==0)return(0);
if(m==0)return(1%n);
unsigned int ModA=l%n;
unsigned int ModB=((m&1)>0)?ModA:1;
for ( m>>=1;m>0;m>>=1){
ModA=(ModA*ModA)%n;
if ((m&1)>0)
ModB=(ModB*ModA)%n;
}
return(ModB);
}
int main(void)
{
unsigned int e,f,g,h;
unsigned char d;
printf("暗号化したい文字(ASCII)");
scanf("%c",&d);
printf("公開鍵");
scanf("%d",&e);
printf("P*Q");
scanf("%d",&f);
g=power((int)d,e,f);
h=d;
printf("%c→%dを%d乗して%dで割った余りは%d\n",d,h,e,f,g);
system("PAUSE");
return 0;
}
/*復号*/
#include<stdio.h>
#include<stdlib.h>
unsigned long long int power( unsigned long long int l, unsigned long long int m, unsigned long long int n )//(指数、底、割る数)
{
if(n>=0x100000000)return(0);
if(l==0||n==0)return(0);
if(m==0)return(1%n);
unsigned long long int ModA=l%n;
unsigned long long int ModB=((m&1)>0)?ModA:1;
for ( m>>=1;m>0;m>>=1){
ModA=(ModA*ModA)%n;
if ((m&1)>0)
ModB=(ModB*ModA)%n;
}
return(ModB);
}
int main(void)
{
unsigned long long int d,e,f,g;
printf("復号したい数字");
scanf("%llu",&d);
printf("秘密鍵");
scanf("%llu",&e);
printf("P*Q");
scanf("%llu",&f);
g=power(d,e,f);
printf("%lluの%llu乗を%lluで割り、復号したら%llu→",d,e,f,g);
printf("%c",g);
system("PAUSE");
return 0;
}
32bitまでしか対応していなくこれを2048bit長に対応させたいです。
何がしたいのか良くわからないかと思いますが私もよく分かってません。
良くわからないものを4月からずっと抱えてきました。このままだといろいろ詰みます。
指導担当の先生が居るのですが私達の指導担当はなにも指導してくれないのです。
せめて手順みたいなものでもいいので教えて下さい、助けてください。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void swap(int a, int b);
void swap(int a, int b){
int temp;
temp=a;
a=b;
b=temp;
}
unsigned int calcGCD( unsigned int a, unsigned int b )
{
if (a<b) swap(a,b);
do {
unsigned int r=a%b;
a=b;
b=r;
} while (b!=0);
return(a);
}
unsigned int calcGCD( unsigned int a, unsigned int b, int& x, int& y )
{
x=1;
y=0;
int x1=0;
int y1=1;
int *pa,*pb;
pa=&x;
pb=&y;
if (a<b) {
swap(a,b);
swap(x,y);
swap(x1,y1);
}
do {
unsigned int q=a/b;
unsigned int r=a%b;
int x2=x-q*x1;
int y2=y-q*y1;
x=x1;
y=y1;
x1=x2;
y1=y2;
a=b;
b=r;
}while(b!=0);
return(a);
}
unsigned int main()
{
int p,q,d,e,f,g,h,i,j;
printf("Pの値は?");
scanf("%d",&p);
printf("Qの値は?");
scanf("%d",&q);
d=(p-1)*(q-1);
printf("公開鍵の値は?");
scanf("%d",&e);
f=calcGCD(d,e);//最大公約数
g=d*e/f;//最小公倍数
j=calcGCD(d,e,h,i);//ax+by=gcd
printf("最大公約数(gcd)は%d最小公倍数(lcm)は%d\n",f,g);
printf( "(%d)x + (%d)y = %d 、 x=%d, y=%d\n", d, e, f, h, i );
FILE *file;
file = fopen("test.txt","w");
fprintf(file,"最大公約数(gcd)は%d最小公倍数(lcm)は%d\n",f,g);
fprintf(file,"(%d)x + (%d)y = %d 、 x=%d, y=%d\n", d, e, f, h, i );
fclose(file);
system("PAUSE");
}
/*暗号化*/
#include<stdio.h>
#include<stdlib.h>
unsigned int power( unsigned int l, unsigned int m, unsigned int n )//(指数、底、割る数)
{
if(n>=0x10000)return(0);
if(l==0||n==0)return(0);
if(m==0)return(1%n);
unsigned int ModA=l%n;
unsigned int ModB=((m&1)>0)?ModA:1;
for ( m>>=1;m>0;m>>=1){
ModA=(ModA*ModA)%n;
if ((m&1)>0)
ModB=(ModB*ModA)%n;
}
return(ModB);
}
int main(void)
{
unsigned int e,f,g,h;
unsigned char d;
printf("暗号化したい文字(ASCII)");
scanf("%c",&d);
printf("公開鍵");
scanf("%d",&e);
printf("P*Q");
scanf("%d",&f);
g=power((int)d,e,f);
h=d;
printf("%c→%dを%d乗して%dで割った余りは%d\n",d,h,e,f,g);
system("PAUSE");
return 0;
}
/*復号*/
#include<stdio.h>
#include<stdlib.h>
unsigned long long int power( unsigned long long int l, unsigned long long int m, unsigned long long int n )//(指数、底、割る数)
{
if(n>=0x100000000)return(0);
if(l==0||n==0)return(0);
if(m==0)return(1%n);
unsigned long long int ModA=l%n;
unsigned long long int ModB=((m&1)>0)?ModA:1;
for ( m>>=1;m>0;m>>=1){
ModA=(ModA*ModA)%n;
if ((m&1)>0)
ModB=(ModB*ModA)%n;
}
return(ModB);
}
int main(void)
{
unsigned long long int d,e,f,g;
printf("復号したい数字");
scanf("%llu",&d);
printf("秘密鍵");
scanf("%llu",&e);
printf("P*Q");
scanf("%llu",&f);
g=power(d,e,f);
printf("%lluの%llu乗を%lluで割り、復号したら%llu→",d,e,f,g);
printf("%c",g);
system("PAUSE");
return 0;
}