差分表示


* 前置き
諸般の事情で、転置暗号を作ることになったので、メモ。
* もっとも初歩@換字暗号
** 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