C#位到位异或&;文件I/O

C#位到位异或&;文件I/O,c#,io,bit-manipulation,xor,C#,Io,Bit Manipulation,Xor,好的,我有一个35MB的文件,它是用位对位异或(我相信是位异或)加密的,我想知道一个解密它的好方法,然后用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----

好的,我有一个35MB的文件,它是用位对位异或(我相信是位异或)加密的,我想知道一个解密它的好方法,然后用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

这不是按位异或-它实际上是按位异或。你意识到这只是“加密”这个词最松散的意义,对吗

基本上,您需要两个步骤:

  • 编写用于转置位进行加密/解密的方法,每个方法取一个32位整数并返回一个32位整数
  • 一次读取一个32位整数,应用适当的操作并将结果写入另一个文件。为此,您可能需要使用
    BinaryReader
    BinaryWriter
(显然,您可以使用缓冲进行优化,但这是一般要点。)

您可能会发现使用
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);
}
公共静态uint加密(uint输入)
{
返回((输入>>0)&1)>1)&1)>2)&1)>31)&1)不是这样。如果是这样,只需将具有相同值的数据再次异或到

您所描述的是某种位置乱加密


正如其他人所说,这不是安全加密。它使用一种通常称为“.”的方法。首先,您必须执行一个函数以获取单个位,然后执行一个函数以将其保存到您想要的任何位置:

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

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

引用上面的话:“我想知道一种解密它的好方法,然后再加密它,使用C#上的文件I/O。”这看起来不像是xor‘加密’,只是有点乱序。使用FileStream和BitVector32。我认为它是按位xor。我想我错了,所以我应该采取什么步骤来实现它?谢谢你的信息,我很感激!
int b1 = getBit(0, word);
int b2 = getBit(18, word);
setBit(0, b1 ^ b2, ref word);