下が暗号化復号プログラムです。
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;
}
かわりにプログラミングしてください。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: かわりにプログラミングしてください。
世の中には暗号化ライブラリが有るので、それを利用されてはいかがですか?
利用したい暗号化アリゴリズムが明確じゃないと、その利用も難しいですが。
利用したい暗号化アリゴリズムが明確じゃないと、その利用も難しいですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: かわりにプログラミングしてください。
コードを提示するときは、BBcodeを有効にした状態でcodeタグで囲み、
かつきちんとインデントをしていただけると、見やすくて助かります。
パッと見だと、累乗して余りを取っている所から、名状しがたいRSAのようなものかもしれません。
外部ライブラリの使用が禁止されていなければ、多倍長計算ライブラリのGMPを使うとうまくいくと思います。
http://gmplib.org/
かつきちんとインデントをしていただけると、見やすくて助かります。
パッと見だと、累乗して余りを取っている所から、名状しがたいRSAのようなものかもしれません。
外部ライブラリの使用が禁止されていなければ、多倍長計算ライブラリのGMPを使うとうまくいくと思います。
http://gmplib.org/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: かわりにプログラミングしてください。
マルチポストされている様ですね。
http://my.chiebukuro.yahoo.co.jp/my/mys ... 6439862282
フォーラムルールの違反となりますので、相互リンクをお願いします。
http://dixq.net/board/board.html
これ以外の掲示板にも投稿している場合には全部の掲示板から全部の掲示板にリンクを張るようにお願いします。
出来たと言われているコードも、ここの写しでは無いでしょうか?
http://fussy.web.fc2.com/algo/algo9-3.htm
あるいは、ベースが同じ?感じです。
http://my.chiebukuro.yahoo.co.jp/my/mys ... 6439862282
フォーラムルールの違反となりますので、相互リンクをお願いします。
http://dixq.net/board/board.html
これ以外の掲示板にも投稿している場合には全部の掲示板から全部の掲示板にリンクを張るようにお願いします。
出来たと言われているコードも、ここの写しでは無いでしょうか?
http://fussy.web.fc2.com/algo/algo9-3.htm
あるいは、ベースが同じ?感じです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: かわりにプログラミングしてください。
マルチポストすみませんでした。
テンプレのリンクありがとうございました。
これで去年の学生がプログラム作った訳ではないのが分かって良かったです。
教授は何も知らないのでしょう。
去年の学生はCを理解しててプログラムを作ったと聞きました
。
その癖、今年は駄目だとか卒業できないよとか脅しをかけてくるのに指導をする気配すらありません。
明日、学校側に相談してみます。
ありがとうございました。
テンプレのリンクありがとうございました。
これで去年の学生がプログラム作った訳ではないのが分かって良かったです。
教授は何も知らないのでしょう。
去年の学生はCを理解しててプログラムを作ったと聞きました
。
その癖、今年は駄目だとか卒業できないよとか脅しをかけてくるのに指導をする気配すらありません。
明日、学校側に相談してみます。
ありがとうございました。
Re: かわりにプログラミングしてください。
まぁ、少なくとも去年の学生さんは4610さんよりも、「自分で調べて解決する能力」には長けていたんでしょうね。
それは、プログラムを勉強する上で非常に大切な能力だとは思いますけどね・・・。
他力本願にしたり、他人のせいにしたりしているうちは、根本的な解決はしないし、進歩もありませんよ。
それは、プログラムを勉強する上で非常に大切な能力だとは思いますけどね・・・。
他力本願にしたり、他人のせいにしたりしているうちは、根本的な解決はしないし、進歩もありませんよ。