« 無くならない?『Winny』ニュース | トップページ | 『はやぶさタン』見つかって良かったぁ~! »

2006年3月 8日 (水)

ボケでも出来る暗号化?

ナチスのEnigma暗号、分散型コンピューティングで解読

当時絶対に解読不可能とされていた暗号文を
現代のコンピューターとマニア~な人達が
突き破った!と言うニュース。


ウィキペディアによると

エニグマ (暗号機)とは
だそうだ…。

で、面白そうなので作ってみた。

/* ---------------------------------- */
#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]」の値がマイナスになるから…かなり危険な所を書き換えています…。

まあ処理は、実にシンプル。
だって、遅いとゲームで使い物にならないし…

もちろん、複数の暗号処理を通す事で
データからの解読は、さらに難しくなる。
でも、遅くなる…。

暗号の目的は、解読するのにコストを
掛けさせることなのでファイル名の
拡張子を変えるのだって有効な方法。

と言う訳で、暗号も適当に…。

|

« 無くならない?『Winny』ニュース | トップページ | 『はやぶさタン』見つかって良かったぁ~! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/8995639

この記事へのトラックバック一覧です: ボケでも出来る暗号化?:

« 無くならない?『Winny』ニュース | トップページ | 『はやぶさタン』見つかって良かったぁ~! »