异或两个 128 位的函数。如何生成 128 位值?
Function to XOR two 128 bits. How do I generate 128 bit values?
我正在尝试学习简单的密码学,作为初学者,我正在努力实现以下目标。
一个函数,将两个 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 位?
例如B25829846AED8
显然是一个 128 位的 WEP 密钥。如果我将其分配给我的 key
变量,并且当我输入 encrypt
方法时,keyBits.Length
属性 的值为 208。这是我没有得到的。另外参数 key
的长度为 26,我也很困惑。
您想使用 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字节。
为什么密钥长度是26?
C#-strings 是 unicode,因此您可以将所有字符写在那里,例如。中文、日文等。这需要两个字节(在 utf-16 中)。 13*2=26.
你的wep-key是128位的吗
您有一个使用 104 位密钥的 128 位 wep-protocoll 密钥。 (欢乐时光)Wiki on Wep
但据我了解,您并不是在尝试实施 wep,而是在尝试对某些内容进行编码。取两个随机整数将它们转换为字节并将它们放在一起。 BAM- 128 位 :)
using System.Linq
byte[] key = BitConverter.GetBytes(25).Concat(BitConverter.GetBytes(284)) ;
除此之外,你总能控制住它,祝你好运:)
我正在尝试学习简单的密码学,作为初学者,我正在努力实现以下目标。
一个函数,将两个 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 位?
例如B25829846AED8
显然是一个 128 位的 WEP 密钥。如果我将其分配给我的 key
变量,并且当我输入 encrypt
方法时,keyBits.Length
属性 的值为 208。这是我没有得到的。另外参数 key
的长度为 26,我也很困惑。
您想使用 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字节。
为什么密钥长度是26?
C#-strings 是 unicode,因此您可以将所有字符写在那里,例如。中文、日文等。这需要两个字节(在 utf-16 中)。 13*2=26.
你的wep-key是128位的吗 您有一个使用 104 位密钥的 128 位 wep-protocoll 密钥。 (欢乐时光)Wiki on Wep
但据我了解,您并不是在尝试实施 wep,而是在尝试对某些内容进行编码。取两个随机整数将它们转换为字节并将它们放在一起。 BAM- 128 位 :)
using System.Linq
byte[] key = BitConverter.GetBytes(25).Concat(BitConverter.GetBytes(284)) ;
除此之外,你总能控制住它,祝你好运:)