みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語で簡単暗号

C言語を初めてけっこう立つんですが。
自分なりにソフトを作ってみました

暗号化、解読ができるソフトです

1.暗号化
2.解読
3.Quit

ソースは
#include <stdio.h>
int main(void)
{
int i;
char da;
back:
modo:
do{
printf("1.angouka\n");
printf("2.kaidoku\n");
printf("3.Quit\n");
scanf("%d",&i);
}while(i<1 || i>3);

if(i==1){
da=getchar();
while(da){
printf("%c",da+1);
da=getchar();
if(da=='.'){
goto modo;
}
}
}
else if(i==2){
da=getchar();
while(da){
printf("%c",da-1);
da=getchar();
if(da=='.'){
goto back;
}
}
}
return 0;
}
なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。
もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう
教えて下さい

投稿日時 - 2007-11-26 22:08:53

QNo.3549534

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

破られにくい暗号は難しいですが、
RSA暗号を学ばれてはいかがでしょうか?
下記のURLの本がとても参考になります。
 問題点は、
鍵を生成するプログラムコードを修正する
必要があることくらいですが、
とてもよい本だと思います。
古本を探してみてください。
http://www.din.or.jp/~shashi/book/rsa.html

参考URL:http://www.din.or.jp/~shashi/book/rsa.html

投稿日時 - 2007-11-28 11:47:57

ANo.2

例えば、
"おはようございます"
という文字列は、質問者様の「暗号化の考え」ですと
"Λπ・ΗΦΨΕ・・"(それぞれの中ポチは異なるんですが、「回答」で被制御、残念)
になる、ということですね。

ようするに、「鍵」を1とした「シーザー暗号」ですね。
シーザーが用いたといわれる3ではなく、はたまた13でもない1としたのはなぜでしょう?(先ほど得た知見からの素朴な★補足要求。それにしても「暗号」は奥が深いですね)。

ソースについては、
>C言語を初めてけっこう立つんですが。
とのこと。

私はC言語を【始めて】今年でちょうど20年になりますが、【初めて】goto文が使われたソースをみました。
B→cの時に、goto文について、いろいろ言われてましたが、懐かしく思いました。

なお、質問者様のソースで下から10数行ほどにある else ですが、
cpuの性能が向上したことで、実行速度を気にせずにプログラミング(個人レベル)できるようになったことから、《実行速度》よりも《分かり易さ》を第一に、elseをとって、

if( 1 == i ){

         // この間に i が変化しない
}
if( 2 == i ){  // i が 1 であるものまで再度判定しちゃうけど・・


}
としたら如何でしょう。
というか、簡潔に iを引数としたひとつの関数にしちゃえば、と思いました。

投稿日時 - 2007-11-27 11:08:06

ANo.1

がると申します。
んと…ざっくりとソースを拝見しての感想です。

暗号、という言葉の定義も少々厄介ではあるのですが。この方法は基本的に「単一換字式暗号」の一種になるかと思いますが…ストレートに申し上げて「秘匿のために用いる」には、あまりにも弱すぎます。

実用性のある「暗号」については。現代暗号は正直「半端ではないレベルの数学知識が不可欠」なので、まずそのあたりについて学ばれてみるとよろしいかと。
そうするとおそらくは「簡単にかけて破れにくい暗号」というものがどういうものか(ここの回答内容に書ける程度のものなのかどうか)がよくわかるかと思います。
…まぁ平たく申し上げて。その道の専門家以外の人間が編み出した暗号もどきは、百害あって一利なし、というのが正直な現状です。

あとソースコード自体ですが。
この程度の内容であれば、goto文無しでもわかりやすく記述出来るかと思います。
とりあえず…
・暗号化及び複合化の処理を関数に切り出す
・goto文を使わずに実装する
あたりからリメイクされてみては如何でしょうか?

以上なにかのご参考にでもなれば幸いです。

投稿日時 - 2007-11-26 23:17:34

補足

1.angouka を選んで .で終了した後にメニューの

printf("1.angouka\n");
printf("2.kaidoku\n");
printf("3.Quit\n");
に戻りたいんですが

goto文はやはり使ってはいけないのでしょうか?
しかも戻る時にはgoto以外に考えつかないんですが

メニューへ戻るヒントをください
お願いします

投稿日時 - 2007-11-27 18:43:24

あなたにオススメの質問