目次

前置き

諸般の事情で、転置暗号を作ることになったので、メモ。

もっとも初歩@換字暗号

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
    • 換字暗号に関する記載は平易に書いてあり、読み物としても面白い。

Last-modified: 2006-03-03 13:18:46