【问题标题】:Function to XOR two 128 bits. How do I generate 128 bit values?对两个 128 位进行异或的功能。如何生成 128 位值?
【发布时间】:2015-08-27 20:32:00
【问题描述】:

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

一个函数,将两个 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);
    }
}

加密器.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 位?

例如B25829846AED8 显然是 128 位 WEP 密钥。如果我将它分配给我的key 变量,并且当我输入encrypt 方法时,keyBits.Length 属性的值是 208。这是我没有得到的。参数key 的长度也是26,我也对此感到困惑。

【问题讨论】:

  • XOR 实际上是非常安全的。事实上,如果处理得当,它是唯一“不可破解”的密码学。它被称为一次性便笺或 OTP。但是,只有在一条消息中只使用一次它并确保平板电脑安全时,它才是安全的。

标签: c# byte bit xor bitarray


【解决方案1】:

为什么密钥长度是 26?

C#-strings 是 unicode,所以你可以写出所有的字符,例如。中文、日文等。这需要两个字节(在 utf-16 中)。 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)) ;

除了你能控制住它,祝你好运:)

【讨论】:

    【解决方案2】:

    您想使用 128 位密钥,即 16 字节。字符串由字符组成,C# 中的 char 数据类型使用 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 = 52 位。将每个字符解释为 ANSI 字符(大小 8 位)将是 13*8 = 104 位。

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

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多