我正在与向我们提供AES加密消息示例的供应商合作,我们有一个共享密钥,而我只是测试加密/解密。
他们提供的解密消息如下所示。通常我会期待一个字符串,但这是他们提供的:
d4 ee 84 87 f4 e2 0d c2 ef 07 e4 2c 9f b2 48 9e
我有点困惑,那是什么样的表示法?
我的加密/解压方法是使用字符串作为输入,字符串作为输出,但在内部我使用字节数组:
byte[] plainBytes = Encoding.Unicode.GetBytes(plainText);
如何将上述输入转换为字节数组?
答案 0 :(得分:3)
它是字节的十六进制represantation
string bytes = "d4 ee 84 87 f4 e2 0d c2 ef 07 e4 2c 9f b2 48 9e";
var buf = bytes.Split(' ').Select(s => Convert.ToByte(s, 16)).ToArray();
如果您的十六进制字符串不包含任何空格
string bytes = "d4ee8487f4e20dc2ef07e42c9fb2489e";
var buf = Regex.Matches(bytes, ".{2}").Cast<Match>()
.Select(x => Convert.ToByte(x.Value, 16)).ToArray();
你甚至可以使用System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary
类来解析带或不带空格的十六进制字符串。
string bytes = "d4ee8487f4e20dc2ef07e42c9fb2489e";
var buf = SoapHexBinary.Parse(bytes).Value;
<强>顺便说一句:强>
您应该注意,如果您使用它,则Encoding.Unicode.GetString
无法将每个字节数组安全地转换为字符串。
var buf = new byte[] { 0xff, 0xff, 0xff };
string str = Encoding.Unicode.GetString(buf);
var buf2 = Encoding.Unicode.GetBytes(str);
buf2
不等于buf
。要将字节数组转换为字符串,请使用Convert.ToBase64String
或BitConverter.ToString
答案 1 :(得分:1)
此代码运行后,theBytes
将包含您的字节数组:
byte[] theBytes = new byte[15];
string hexstring = "d4ee8487f4e20dc2ef07e42c9fb2489e";
for (int i = 0; i < 15; i++)
{
string thisByte = hexstring.Substring(i * 2, 2);
int intValue = Convert.ToInt16(thisByte, 16);
theBytes[i] = BitConverter.GetBytes(intValue)[0];
}