为什么编码的密钥不等于原始密钥?



语言:C#,框架:.NET Core 3.1

我使用基于AES的加密。

研究:
密钥格式AES

Gilles:AES密钥只是一堆没有结构的比特

Key和IV需要存储,因为它们每次都是随机生成的,并且是加密和解密所必需的

出于特殊原因,我需要将其存储为字符串,因此我希望能够将字节数组转换为字符串,并在需要时使用编码进行反向转换。

转换使用UTF-8编码。

我的问题:
我在代码中放置了一个断点,字节数组的内容与原始数组明显不同。我尝试过切换到其他编码格式,但也失败了。简而言之,数据发生了更改,这将导致无法解密消息,因为AES密钥和IV不正确。

更新:
keyBytes不包含有效的utf8数据时,UTF-8转换不起作用,编码器将生成导致问题的回退数据。

示例:

using (Aes myAes = Aes.Create())
{
bool valid = false;
byte[] keyBytes = myAes.Key;
Encoding utf8WithoutBom = new UTF8Encoding(true);
string key = utf8WithoutBom.GetString(keyBytes);
byte[] outputBytes = utf8WithoutBom.GetBytes(key);
if (myAes.Key.Length == outputBytes.Length) {
for (int i = 0; i < myAes.Key.Length; i++) {
if (outputBytes[i] == keyBytes[i]) {
valid = true;
}
else {
valid = false;
break;
}
}
}
if (valid == true) {
Console.WriteLine("Succes");
}
else {
Console.WriteLine("Error");
throw new Exception("The keys do not match.");
}
}

结果:
-输出:byte[],大小在50~54Error之间
-所需输出:byte[32],数据与原始数组Succes相同

问题:
为什么输出字节数组的内容与原始字节数组不同?

只有当初始字节数组包含有效的utf8内容时,才能从byte[] -> string -> byte[]进行转换。并不是每个32字节的数组都能做到这一点。

如果原始数组包含无效数据,则byte[]->字符串转换将已经返回一些回退数据,第二次转换将这些回退值转换为相应的字节。

如果要将任意字节数组编码为字符串,请使用Base64或其他通用数据编码,但不要使用utf8。

最新更新