2010-12-08 17 views
0

にこの暗号を変換しますこれは私が使用してC#コードです:はどのように私はC#2からC

public void Decrypt(byte[] @in, byte[] @out, int size) 
{ 
    lock (this) 
    { 
     for (ushort i = 0; i < size; i++) 
     { 
      if (_server) 
      { 
       @out[i] = (byte)(@in[i]^0xAB); 
       @out[i] = (byte)((@out[i] << 4) | (@out[i] >> 4)); 
       @out[i] = (byte)(ConquerKeys.Key2[_inCounter >> 8]^@out[i]); 
       @out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF]^@out[i]); 
      } 
      else 
      { 
       @out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF]^@in[i]); 
       @out[i] = (byte)(ConquerKeys.Key2[_inCounter >> 8]^@out[i]); 
       @out[i] = (byte)((@out[i] << 4) | (@out[i] >> 4)); 
       @out[i] = (byte)(@out[i]^0xAB); 
      } 
      _inCounter = (ushort)(_inCounter + 1); 
     } 
    } 
} 

、これは私はいくつかのためにしかしC.

char* decrypt(char* in, int size, int server) 
{ 
    char out[size]; 
    memset(out, 0, size); 
    for (int i = 0; i < size; i++) 
    { 
     if (server == 1) 
     { 
      out[i] = in[i]^0xAB; 
      out[i] = out[i] << 4 | out[i] >> 4; 
      out[i] = Key2[incounter >> 8]^out[i]; 
      out[i] = Key1[incounter & 0xFF]^in[i]; 
     } 
     else if (server == 0) 
     { 
      out[i] = Key1[incounter & 0xFF]^in[i]; 
      out[i] = Key2[incounter >> 8]^out[i]; 
      out[i] = out[i] << 4 | out[i] >> 4; 
      out[i] = out[i]^0xAB; 
     } 
     incounter++; 
    } 
    return out; 
} 

を動作するように変換する方法でありますCが動作しない理由。

Link for the full C# file

Link for the full C file

Link for the C implementation

+2

C#ソースがCから移植されたようです。ああ、楽しい!電話ゲーム! – cdhowie

+0

ユニットテストはありますか? – khachik

+0

@khachik、そうではありません。 – Basser

答えて

3

翻訳に失敗しました。

C#ライン:

@out[i] = (byte)(ConquerKeys.Key1[_inCounter & 0xFF]^@out[i]); 

になった:

out[i] = Key1[incounter & 0xFF]^in[i]; 

XOR(^)の右側の値は間違った配列からのものです。

また、スタック割り当て変数を返すと、さまざまな問題が発生します。

変更:

char out[size]; 
memset(out, 0, size); 

へ:

char *out = (char*)calloc(size, sizeof(char)); 
+0

ありがとう!私は自分自身を見つけて、1時間以上探していたはずです。みなさんのご迷惑をおかけして申し訳ありません。 – Basser

+0

問題ありません。あなたが同じコードを見つめていたら、そのようなエラーには目が見えなくなります。フレッシュな目は常に助けます。 – jtdubs

+0

実際に、私はこれで解決しなかったことを知りました。それは正しいように見えました。しかし、それはまだ動作していません。 :/ – Basser

3

私が見る最も明白なエラーは、次の関数呼び出しによって踏みつけ取得する予定ですスタック割り当てられた配列へのポインタを返すことですその後decrypt()が返されます。書き込み可能なバッファへのポインタをバッファに渡すか、またはそのバッファに渡す必要があります。malloc()

+0

例を使って私を助けてくれますか?これは、アンマネージコードを含む最初のプロジェクトです。 :/ – Basser

+1

'char out [size];'を 'char * out =(char *)malloc(size * sizeof(char));'に置き換えます。 'decrypt()'を呼び出すコードは、メモリが終了すると 'free()'を行います。 – cdhowie

+0

@cdhowie、まだ動作していません... 私はオリジナルの投稿を編集して実装を追加しました。 – Basser

1

不正なローカル変数への参照を返しています。呼び出し元に配列を渡すか、malloc()を使用してメソッド内に配列を作成します。

+2

いいえ、ローカル変数を返すことは不正ではありません。スタック割り当て変数**への**ポインタの返却は不正です。 (あるいは、少なくとも未定義の振る舞いで)また、 "ローカル"と "スタック割り当て"の違いに注意してください - 前者には関数スコープの静的変数が含まれています。後者はそうではない。 – cdhowie

1

また、私はそれがより移植性があるため、unsigned charcharを回し示唆しています。お使いのプラットフォームがと同じ場合は、signed charと同じですが、算術演算(ビットシフトなど)は正しく機能しません。
unsigned charを明示的に指定してください(タイプ定義を使用するかunsigned charが長すぎると思われる場合は<stdint.h>を含める)。

関連する問題