2016-07-05 4 views
-3

私はCの教祖ではなく、助けが必要です。運BUこの質問にいくつかの他の回答を読むためにすでに試みました'int'型を暗黙的に 'byte'に変換することはできません。コンパイル時に明示的な変換が存在します(キャストがありませんか?)

baseKey = (15 + baseKey * 250) * baseKey + 19; 
      baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109; 

pDst[i] = (src[i]^171); 
dst[i] = (pSrc[i]^171); 

{ 
    private ushort InCounter; 

    private ushort OutCounter; 

    private byte[] cipherKey1 = new byte[256]; 

    private byte[] cipherKey2 = new byte[256]; 

    public AuthCipher() 
    { 
     byte baseKey = 157; 
     byte baseKey2 = 98; 
     for (int i = 0; i < 256; i++) 
     { 
      this.cipherKey1[i] = baseKey; 
      this.cipherKey2[i] = baseKey2; 
      baseKey = (15 + baseKey * 250) * baseKey + 19; 
      baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109; 
     } 
     this.InCounter = 0; 
     this.OutCounter = 0; 
    } 

    public unsafe void Encrypt(byte* src, int srcOffset, byte[] dst, int dstOffset, int length) 
    { 
     fixed (byte* pDst = &dst[dstOffset]) 
     { 
      for (int i = srcOffset; i < srcOffset + length; i++) 
      { 
       pDst[i] = (src[i]^171); 
       pDst[i] = (byte)(pDst[i] >> 4 | (int)pDst[i] << 4); 
       byte* expr_39 = pDst + i; 
       *expr_39 ^= this.cipherKey2[this.InCounter >> 8]; 
       byte* expr_51 = pDst + i; 
       *expr_51 ^= this.cipherKey1[(int)(this.InCounter & 255)]; 
       this.InCounter += 1; 
      } 
     } 
    } 

    public unsafe void Decrypt(byte[] src, int srcOffset, byte* dst, int dstOffset, int length) 
    { 
     fixed (byte* pSrc = &src[srcOffset]) 
     { 
      for (int i = dstOffset; i < dstOffset + length; i++) 
      { 
       dst[i] = (pSrc[i]^171); 
       dst[i] = (byte)((int)dst[i] << 4 | dst[i] >> 4); 
       byte* expr_35 = dst + i; 
       *expr_35 ^= this.cipherKey2[this.OutCounter >> 8]; 
       byte* expr_4C = dst + i; 
       *expr_4C ^= this.cipherKey1[(int)(this.OutCounter & 255)]; 
       this.OutCounter += 1; 
      } 
     } 
    } 
} 

エラーがでポップ: 私はこのコードを持っています。 いずれかは、おそらく、私はそれを修正する方法を知っていただきました!間違った:)

任意の助けが理解されるであろう理解で私を助けることができれば。あなたは255よりも大きい店舗番号にbyteを使用することはできません

+7

少なくとも、あなたが使っているどの言語を知っています。 – LogicStuff

+2

ちょっとしたメモとして:あなた自身の暗号化/復号化コードを振るのではなく、既存のよく知られている(よく分析された)実装を使用するのは良いことです。 'expr_39'など、ここで私はあなたが実際にリバースエンジニアリングしている、これをどこからかと思わせる... –

答えて

3

に3648確かに、C#の(ないC)で、byte上のほとんどの操作の結果は、(逆説的に、それは本当に理にかなっている)であるint。これは、byteにキャストする必要があることを意味しますが、丸めの振る舞いなどについて考える必要があります。単純な修正は次のようになります。

baseKey = (byte)((15 + baseKey * 250) * baseKey + 19); 
baseKey2 = (byte)((121 - baseKey2 * 92) * baseKey2 + 109); 
... 
pDst[i] = (byte)(src[i]^171); 
... 
dst[i] = (byte)(pSrc[i]^171); 

しかし、あなたはそれらを検証できます。

+0

は、このを使用し、魔法のように働いているようだ使用:)ありがとう –

0

baseKey = (15 + baseKey * 250) * baseKey + 19; 
baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109; 

次に、あなたのbaseKey > 255、あなたはその番号を格納するint変数を宣言しています。あなたは結果はその後、バイトであることを確認している場合は

3

int

baseKey = Convert.ToByte((15 + baseKey * 250) * baseKey + 19); 
baseKey2 = Convert.ToByte((121 - baseKey2 * 92) * baseKey2 + 109); 
あなたが baseKeyを変更する必要があり、他の

baseKey2Rangesは以下の通りです:

バイト:0

255へのInt:-2,147,48 2147483647

+0

は' Convert'は非常行き過ぎここに... –

0

中間計算は、いくつかのint型を使用します。また、あなたの結果は1バイトで表現するには大きすぎます。事はあなたがこのようなものを取ることができないということです。

一つの解決策は、実際に(キャストオペレータ又はConvert.ToByte関数を使用して)明示的な変換を実行することです。

関連する問題