目次
前置き
諸般の事情で、転置暗号を作ることになったので、メモ。
もっとも初歩@換字暗号
caesar cipher
アルファベットの26文字を単純に何個かずらす。
[換字表]
orign : abcdefghijklmnopqrstuvwxyz
shift : bcdefghijklmnopqrstuvwxyza
[例文]
orign : This is a pen.
shift : Uijt jt b qfo.
caeser cipherの一般化
アルファベット26文字に対応表を別途用意する。換字表の配列は任意。
[換字表]
orign : abcdefghijklmnopqrstuvwxyz
shift : bcdeighfjklmnopqrstuvwxyza
[例文]
orign : This is a pen.
shift : Uijt jt b qio.
ちょっとup@鍵付き換字暗号
vignere cipher
換字を生成する際に、keywordを連動させる。
サンプルは[a-zA-Z0-9]対応版
#include <stdio.h>
#include <string.h>
char map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
int getIndex(char c) {
int i;
int flag = 0;
for ( i = 0; i < strlen(map); i++ ) {
if ( c == map[i] ) {
flag = 1;
break;
}
}
if ( flag == 0 ) {
i = -1;
}
return i;
}
char vignere(char o, char k) {
char c;
int oidx, kidx, idx;
oidx = getIndex(o);
if ( oidx == -1 ) {
return o;
}
kidx = getIndex(k);
idx = (oidx + kidx) % strlen(map);
c = map[idx];
return c;
}
int main(int argc, char *argv[]) {
int i;
char *orign = argv[1];
char *key = argv[2];
int klen, olen;
olen = strlen(orign);
klen = strlen(key);
printf("%s\n", orign);
for ( i = 0; i < strlen(orign); i++ ) {
printf("%c", vignere(orign[i], key[i%klen]));
}
printf("\n");
return 0;
}
[例文]
This is a pen.
3BWS WS O JSN.
参考文献
- ja.wikipedia
- 換字暗号に関する記載は平易に書いてあり、読み物としても面白い。
|