差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
* 前置き
諸般の事情で、転置暗号を作ることになったので、メモ。
* もっとも初歩@換字暗号
** 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 main(int argc, char *argv[]) {
int i;
char orign[] = "This is a pen";
char key[] = "0";
char *orign = argv[1];
char *key = argv[2];
int klen, olen;
char c;
olen = strlen(orign);
klen = strlen(key);
printf("%s\n", orign);
for ( i = 0; i < strlen(orign); i++ ) {
if ( orign[i] != ' ' ) {
c = vignere(orign[i], key[i%klen]);
} else {
c = orign[i];
}
printf("%c", c);
printf("%c", vignere(orign[i], key[i%klen]));
}
printf("\n");
return 0;
}
[例文]
This is a pen.
3BWS WS O JSN.
--)
* 参考文献
- ja.wikipedia
-- 換字暗号に関する記載は平易に書いてあり、読み物としても面白い。
Last-modified: 2006-03-03 13:18:46