ボケでも出来る暗号化?
当時絶対に解読不可能とされていた暗号文を
現代のコンピューターとマニア~な人達が
突き破った!と言うニュース。
ウィキペディアによると
エニグマ (暗号機)とは
だそうだ…。
で、面白そうなので作ってみた。
/* ---------------------------------- */
#include<stdio.h>
#include<stdlib.h>
/* -------------------------------------
簡単で良く使われるが解読もし易い。
------------------------------------- */
void cipher_xor(char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
buffer[i]^=0xFF;
}
/* -------------------------------------
簡単で良く使われるが解読もし易い。
------------------------------------- */
void cipher_shift(char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
buffer[i]+=3;
}
void decipher_shift(char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
buffer[i]-=3;
}
/* -------------------------------------
あまり見ない。テーブルの分上記よりは重い。
データからの解読は、困難。
------------------------------------- */
unsigned char cipher_table[0x100];
unsigned char decipher_table[0x100];
void cipher_initial(void)
{
unsigned int i, j;
unsigned char code;
srand(0);
for(i=0;i<0x100;i++)
cipher_table[i]=i;
for(i=0;i<0x100-1;i++)
{
j=(0x100-1-i)*rand()/(RAND_MAX+1)+i+1;
code=cipher_table[i];
cipher_table[i]=cipher_table[j];
cipher_table[j]=code;
}
for(i=0;i<0x100;i++)
decipher_table[cipher_table[i]]=i;
}
void cipher(char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
buffer[i]=cipher_table[buffer[i]];
}
void decipher(char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
buffer[i]=decipher_table[buffer[i]];
}
/* -------------------------------------
まず見ません…。重いです。データからの解読は、困難。
テキスト程度なら使えるかも…。
乱数をそらで見破れる人が居れば別…。<居ないと思うが…。
------------------------------------- */
void cipher_special(char*buffer,unsigned int size)
{
unsigned int i;
srand(0);
for(i=0;i<size;i++)
buffer[i]+=rand();
}
void decipher_special(char*buffer,unsigned int size)
{
unsigned int i;
srand(0);
for(i=0;i<size;i++)
buffer[i]-=rand();
}
/* ---------------------------------- */
void output(unsigned char*buffer,unsigned int size)
{
unsigned int i;
for(i=0;i<size;i++)
{
if((i!=0)&&((i%8)==0))
printf("\n");
printf("0x%02X,",buffer[i]);
}
printf("\n\n");
}
/* ---------------------------------- */
char sample[]="cipher and decipher test program.";
void main( void )
{
printf("XOR式\n");
output(sample,sizeof(sample));
cipher_xor(sample,sizeof(sample));
output(sample,sizeof(sample));
cipher_xor(sample,sizeof(sample));
output(sample,sizeof(sample));
/* -- */
printf("シフト式\n");
output(sample,sizeof(sample));
cipher_shift(sample,sizeof(sample));
output(sample,sizeof(sample));
decipher_shift(sample,sizeof(sample));
output(sample,sizeof(sample));
/* -- */
printf("置換式\n");
cipher_initial();
/*
output(cipher_table,sizeof(cipher_table));
output(decipher_table,sizeof(decipher_table));
*/
output(sample,sizeof(sample));
cipher(sample,sizeof(sample));
output(sample,sizeof(sample));
decipher(sample,sizeof(sample));
output(sample,sizeof(sample));
/* -- */
printf("シフト式の思い奴\n");
output(sample,sizeof(sample));
cipher_special(sample,sizeof(sample));
output(sample,sizeof(sample));
decipher_special(sample,sizeof(sample));
output(sample,sizeof(sample));
}
/* ---------------------------------- */
ちなみに、「unsigned char cipher_table[0x100];」を「char cipher_table[0x100];」にすると
正体不明のバグが発生します。原因は、「decipher_table[cipher_table[i]]=i;」で
「cipher_table[i]」の値がマイナスになるから…かなり危険な所を書き換えています…。
まあ処理は、実にシンプル。
だって、遅いとゲームで使い物にならないし…
もちろん、複数の暗号処理を通す事で
データからの解読は、さらに難しくなる。
でも、遅くなる…。
暗号の目的は、解読するのにコストを
掛けさせることなのでファイル名の
拡張子を変えるのだって有効な方法。
と言う訳で、暗号も適当に…。
| 固定リンク
コメント