2012-03-30 8 views
1

私は暗号化に非常に関心があります。プログラミングも好きなので、XTEA暗号化アルゴリズムを使ってファイルを暗号化するための小さなプログラムを作ることにしました。 私はWikipediaからインスピレーションを得た、と私は、暗号化を行うには、この関数を書きました(それはほとんど同じであるとして、スペースを節約するために、私は、解読機能を掲載しません):XTEA暗号化機能を使用するタイプ

void encipher(long *v, long *k) 
{ 
    long v0 = v[0], v1 = v[1]; 
    long sum = 0; 
    long delta = 0x9e3779b9; 
    short rounds = 32; 
    for(uint32 i = 0; i<rounds; i++) 
    { 
     v0 += (((v1 << 4)^(v1 >> 5)) + v1)^(sum + k[sum & 3]); 
     sum += delta; 
     v1 += (((v0 << 4)^(v0 >> 5)) + v0)^(sum + k[(sum>>11) & 3]); 
    } 
    v[0] = v1; 
    v[1] = v1; 
} 

を今私が欲しいときそれを使用するために、私はこのコードを書いた:

long data[2]; // v0 and v1, 64bits 
data[0] = 1; 
data[1] = 1; 

long key[4]; // 4 * 4 bytes = 16bytes = 128bits 
*key = 123; // sets the key 

cout << "READ: \t\t" << data[0] << endl << "\t\t" << data[1] << endl; 
encipher(data, key); 
cout << "ENCIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

decipher(data, key); 
cout << "DECIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

を私は常に取得するのいずれかの実行時にクラッシュまたは間違った解読テキスト: enter image description here

私はプログラムの基本を理解して、私は本当にしないでください何があるかを知る私のコードで間違っています。暗号化されたデータ[0]とデータ1が同じ理由は何ですか?そして、解読されたデータが開始データとまったく異なるのはなぜですか?タイプを間違って使用していますか? 私はあなたが私の問題を解決するのを助けてくれることを願っています:)。

答えて

4

問題はここにある:また

v[0] = v1; // should be v[0] = v0 
v[1] = v1; 

、あなただけのキーの最初の4つのバイトを設定します。残りの12バイトは初期化されていません。このような何かを試してみてください :

key[0] = 0x12345678; 
key[1] = 0x90ABCDEF; 
key[2] = 0xFEDCBA09; 
key[3] = 0x87654321; 

The fixed codeが私にこの出力を与える:答えのための

READ:   1 
       1 
ENCIPHERED:  -303182565 
       -1255815002 
DECIPHERED:  1 
       1 
+0

感謝を! 私の愚かなミスタイプはv1とv0でわかります。 キーのバイトの設定について説明してください。私は本当に16進数についてはあまり知りませんが、キー[1 ... 3]を0に設定することはできませんか? 残念ながら、あなたの答えは主な問題を解決しませんでしたが、私はそれが大いに役立ったと確信しています! – Janman

+0

@Janman:キー[1]、キー[2]、キー[3]を0に設定できますが、* something *に設定する必要があります。あなたが何かにそれらを設定しない場合、彼らはunintializedであり、ちょうどメモリのその部分に任意の値を持っています。変更にはうまくいきませんでしたか?あなたはおそらく '解読'で同様の問題を抱えていますか? –

+0

ありがとう、今私はそれを作った。私ができる場合、ちょっとだけ質問してください: ファイルからデータを読みたいときは、ちょうど: 'myIfstream.readsome((char *)&data [0]、4);'この手順を使用して暗号化しますか? – Janman

関連する問題