転置式暗号の実装

転置式暗号とは

平文の文字を入れ替えて作る暗号化の方法のことです。一番目と二番目の文字を入れ替える。三番目と四番目の文字を入れ替える、など様々な転置の法則で暗号文を作ります。

実装

今回は文字列を abcdefg の場合 abcd efg というように4文字単位で区切って、以下の方式で転置しようと思います。

1番目→3番目
2番目→1番目
3番目→4番目
4番目→2番目

それで、実装したコードがこれです。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int tau[][4] = {{1,2,3,4},
                {3,1,4,2}};

void transposition(char str[]) {
  int i, j;
  int main, sub;
  char tmp;
  char len4[4];

  printf("暗号化(0) 復号(1) >> ");
  scanf("%d", &main);

  printf("文字列>");
  scanf("%s", str);

  if (main) {
    sub = 0;
    for (i = 0; i < strlen(str); i++) {
      str[i] = tolower(str[i]);
    } 
  } else {
    sub = 1;
    for (i = 0; i < strlen(str); i++) {
      str[i] = toupper(str[i]);
    } 
  }

  
  for (i = 0; i < strlen(str)/4; i++) {
    for (j = 0; j < 4; j++) {
      len4[j] = str[i*4+j];
    }
    for (j = 0; j < 4; j++) {
      str[i*4+tau[main][j]-1] = len4[tau[sub][j]-1];
    }
  }
}

int main(void) {
  char str[256];

  transposition(str);

  printf("%s\n", str);

  return 0;

}

tauという二次元配列を作っておいて、暗号化と復号に対応できるようにしました。
4文字区切りにして、あまりが0でなかった場合の処理は、文字数に対応した転置を行なうかパディングするかなどがあるのですが、今回はそのまま表示することにしました。
実行結果を載せます。

f:id:kisaragi211:20190223185145p:plain

f:id:kisaragi211:20190223185230p:plain

ということで転置式暗号の暗号化と復号の結果になります。
両方ともうまくいってると思います。

おわりに

転置式は必ず平文の文字が使われるので、換字式と比べると弱いのかな?と思いました。
勉強したてなので、まだわかりませんが...

p.s.
画像サイズがいつも大きくてすいません。
やる気のあるときにサイズ小さくします。