2011-03-06 30 views
0

好的,我有一個35 MB的文件,這是加密位到位異或(我相信按位異或),我想知道一個很好的方法來解密它,然後使用C#上的File I/O再次對其進行加密。C#位到位異或文件I/O

這裏是出Enc/Dec算法:

Encrypt:----------------------Decrypt: 
Bit 0 -> Bit 26--------------Bit 0 -> Bit 18 
Bit 1 -> Bit 31--------------Bit 1 -> Bit 29 
Bit 2 -> Bit 17--------------Bit 2 -> Bit 7 
Bit 3 -> Bit 10--------------Bit 3 -> Bit 25 
Bit 4 -> Bit 30--------------Bit 4 -> Bit 15 
Bit 5 -> Bit 16--------------Bit 5 -> Bit 31 
Bit 6 -> Bit 24--------------Bit 6 -> Bit 22 
Bit 7 -> Bit 2--------------Bit 7 -> Bit 27 
Bit 8 -> Bit 29--------------Bit 8 -> Bit 9 
Bit 9 -> Bit 8--------------Bit 9 -> Bit 26 
Bit 10 -> Bit 20--------------Bit 10 -> Bit 3 
Bit 11 -> Bit 15--------------Bit 11 -> Bit 13 
Bit 12 -> Bit 28--------------Bit 12 -> Bit 19 
Bit 13 -> Bit 11--------------Bit 13 -> Bit 14 
Bit 14 -> Bit 13--------------Bit 14 -> Bit 20 
Bit 15 -> Bit 4--------------Bit 15 -> Bit 11 
Bit 16 -> Bit 19--------------Bit 16 -> Bit 5 
Bit 17 -> Bit 23--------------Bit 17 -> Bit 2 
Bit 18 -> Bit 0--------------Bit 18 -> Bit 23 
Bit 19 -> Bit 12--------------Bit 19 -> Bit 16 
Bit 20 -> Bit 14--------------Bit 20 -> Bit 10 
Bit 21 -> Bit 27--------------Bit 21 -> Bit 24 
Bit 22 -> Bit 6--------------Bit 22 -> Bit 28 
Bit 23 -> Bit 18--------------Bit 23 -> Bit 17 
Bit 24 -> Bit 21--------------Bit 24 -> Bit 6 
Bit 25 -> Bit 3--------------Bit 25 -> Bit 30 
Bit 26 -> Bit 9--------------Bit 26 -> Bit 0 
Bit 27 -> Bit 7--------------Bit 27 -> Bit 21 
Bit 28 -> Bit 22--------------Bit 28 -> Bit 12 
Bit 29 -> Bit 1--------------Bit 29 -> Bit 8 
Bit 30 -> Bit 25--------------Bit 30 -> Bit 4 
Bit 31 -> Bit 5--------------Bit 31 -> Bit 1 
+1

那麼你的問題是什麼? – vissi 2011-03-06 20:36:57

+0

來自上面的引用: 「我想知道解密它的一種好方法,然後再次使用C#上的文件I/O對其進行加密」 – Phant0m 2011-03-06 20:38:12

+0

這看起來不像xor'加密',只是一點點洗牌。使用FileStream和BitVector32。 – 2011-03-06 20:38:22

回答

4

這不是一個按位異或 - 它實際上是一個按位substitution cypher。你意識到這只是最簡單的「加密」,對吧?

基本上就需要兩個步驟:

  • 編寫方法來轉用於加密/解密位,每一個走一個32位整數並返回一個32位的整數
  • 讀取文件的一次32位整數,應用適當的操作並將結果寫出到另一個文件中。你可能很想使用BinaryReaderBinaryWriter

(很明顯,你可以用緩衝優化,不過是一般的要點。)

你會發現它是最容易uint代替int合作,以避免擔心符號位。這樣的事情:

public static uint Encrypt(uint input) 
{ 
    return (((input >> 0) & 1) << 26) | 
      (((input >> 1) & 1) << 31) | 
      (((input >> 2) & 1) << 17) | 
      ... 
      (((input >> 31) & 1) << 5); 
} 

你可以使這個表驅動一個表加密和解密表,但我不知道我會打擾。

注意,如果你用它來存儲敏感信息是實際上,你應該開始儘快使用真正加密。

+0

感謝您的信息,我很感激! – Phant0m 2011-03-06 21:05:43

1

那不是XOR。如果是這樣,你只需將具有相同值的數據再次異或爲decrypt it即可。

你所描述的是某種比特加擾加密。

正如其他人所說,這不是安全的加密。它使用通常被稱爲「security through obscurity」的方法。

1

首先,你必須做一個函數來獲取一個位和一個函數來保存它,無論你想:

int getBit(int position, int word) 
{ 
    return ((word >> position) & 1); 
} 

void setBit(int position, int value, ref word) 
{ 
    word = (word & (value << position)); 
} 

然後,你必須做手工每次轉換,類似(如果我明白你的算法正確):

int b1 = getBit(0, word); 
int b2 = getBit(18, word); 
setBit(0, b1^b2, ref word); 
+0

謝謝你,先生:) – Phant0m 2011-03-06 21:06:20