XOR两个128位的功能。如何生成128位值?

时间:2015-06-11 22:53:05

标签: c# byte bit xor bitarray

我正在尝试学习简单的密码学,作为入门者,我正在努力实现以下目标。

一个函数,将两个128位参数(密钥和明文)作为输入并返回它们的XOR。我知道XOR不安全,但我从一个简单的例子开始。

这就是我的尝试:

class Program

    static void Main(string[] args)
    {
        string key = "B25829846AED8"; //128 bits??
        string plaintext = "A9BB51625ECBE"; //128 bits??

        //Convert key to byte array
        byte[] keyBytes = new byte[key.Length * sizeof(char)];
        System.Buffer.BlockCopy(key.ToCharArray(), 0, keyBytes, 0, keyBytes.Length);

        //Convert plaintext to byte array
        byte[] plaintextBytes = new byte[plaintext.Length * sizeof(char)];
        System.Buffer.BlockCopy(plaintext.ToCharArray(), 0, plaintextBytes, 0, plaintextBytes.Length);

        //Encrypt (XOR)
        string result = new Encrypter().encrypt(keyBytes, plaintextBytes);
    }
}

Encrypter.cs:

class Encrypter
{

    public string encrypt(byte[] key, byte[] plaintext)
    {
        BitArray keyBits = new BitArray(key);
        BitArray plaintextBits = new BitArray(plaintext);

        if(keyBits.Length == plaintextBits.Length)
        {
            BitArray result = keyBits.Xor(plaintextBits);
            return result.ToString();
        }

        return null;
    }
}

我的问题:

我正在努力解决关键和明文的问题。如何确保每个值正好是128位?

E.g。 B25829846AED8显然是128位WEP密钥。如果我将此分配给我的key变量,当我输入encrypt方法时,keyBits.Length属性的值为208.这是我无法得到的。参数key的长度也是26,我也很困惑。

2 个答案:

答案 0 :(得分:1)

您想使用128位密钥,换句话说,使用16个字节。字符串由字符组成,C#中的字符数据类型使用2个字节(16位)。因此,您可以从长度为8的字符串生成一个16字节的密钥,这有点问题,因为由于不可打印的字符等原因很难使用完整的128位范围。将密钥表示为一个长度为16的字节数组会更容易,例如:byte[] key = {1, 8, 255, 12, 2, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 5};

你说B25829846AED8是128位密钥。解释为字符串不是这样:13个字符= 26个字节= 208位,因此这是对结果的解释。将每个字符解释为十六进制数字,此键为13 * 4 = 52bit。将每个字符解释为ANSI字符(大小为8位)将为13 * 8 = 104位。

因此,要从字符串或数字生成密钥的字节数组,您必须定义如何解释字符串或数字。如上所述,最简单的方法是直接输入16个字节。

答案 1 :(得分:1)

为什么键长26?

C#-strings是unicode,所以你可以写出所有字符,例如。中文,日文等等。这需要两个字节。 13 * 2 = 26。

你的wep-key是128位 您已获得128位wep-protocoll的密钥,该密钥使用104位密钥。 (有趣的时间)Wiki on Wep

但据我了解,您并未尝试实施wep,而是尝试对某些内容进行编码。取两个随机整数将它们转换为字节并将它们放在一起。 BAM-128位:)

using System.Linq 

byte[] key = BitConverter.GetBytes(25).Concat(BitConverter.GetBytes(284)) ;

除了你接缝以控制它,祝你好运:)