« 研究室を訪問してきた | トップページ | C言語の有効範囲(スコープ) »

2007/12/21

復号を考慮した暗号プログラム

このブログでは以前、シーザー(シフト)暗号とアフィン暗号プログラムを紹介しましたが、このとき作ったプログラムは復号のことを考慮していませんでした。(つまり、暗号化したはいいものの、それを復号できない代物)

復号化を考慮したものは次のようになります。

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言語の有効範囲(スコープ) »

C」カテゴリの記事

Algorithm」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 復号を考慮した暗号プログラム:

« 研究室を訪問してきた | トップページ | C言語の有効範囲(スコープ) »