復号を考慮した暗号プログラム
このブログでは以前、シーザー(シフト)暗号とアフィン暗号プログラムを紹介しましたが、このとき作ったプログラムは復号のことを考慮していませんでした。(つまり、暗号化したはいいものの、それを復号できない代物)
復号化を考慮したものは次のようになります。
1.シフト暗号(使用する文字数28の場合)
int angouka(int num, int key) { int angou; key = (key + 28) % 28; if(key < 0){ key = key + 28; } angou = (num + key) % 28; return angou; }
[解説]
この関数の引数のnumは入力した文字に割り振られた番号(別関数によって規格化されたもの、例えばa=0, b=1,.....,z=25)で、keyは(暗号/復号)鍵です。復号するには復号鍵の扱い方を考えなければなりません。(復号鍵=暗号鍵×(-1)としています)
つまり、鍵が-3なら28-3=25というようにします。このとき復号鍵の絶対値>使用する文字数だと復号できないので上のコードのようにすることで鍵の絶対値が28より大きくならないようにする必要があります。
2.アフィン暗号(使用文字数28)
int affine(int num, int key1, int key2) { int angou; int check = gcd(key1, 28); if(check == 0){ fprintf(stderr, "This Key is incorrect!\n"); exit(1); }else{ if(mode == 1){ angou = (num*key1 + key2) % 28; }else if(mode == -1){ angou = ( key1*(num - key2) ) % 28; if(angou < 0) angou = angou + 28; } } return angou; }
[解説]
このプログラムでは暗号モード(mode=1)と復号モード(mode=-1)を選んで動作させるようにしてあります。(復号鍵1は暗号鍵1の逆元(mod 28)、復号鍵2=暗号鍵2)ここでも復号するときに注意が必要で、(鍵1+鍵2)>使用文字数になると正しく復号できません。そこで、このコードのように書いたら正しく復号できるようになりました。(動作確認はしましたが、思いつきなので、深く考察していません)
| 固定リンク
「C」カテゴリの記事
- CG法(2008.12.09)
- NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その5(2008.10.10)
- NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その4(2008.10.09)
- NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その3(2008.10.08)
- NTEmacs + MinGW + MSYSでWindows上にC言語開発環境を構築してみる - その2(2008.10.07)
「Algorithm」カテゴリの記事
- コラッツの問題(2008.02.21)
- フィボナッチ数を求める(2008.02.19)
- べき剰余を求める(2008.02.12)
- RSA暗号プログラム(2008.02.09)
- RSA暗号の公開鍵と秘密鍵を生成する(2008.02.08)
この記事へのコメントは終了しました。
コメント