Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不是';编码密钥是否等于原始密钥?_C#_Encryption_Encoding_Aes - Fatal编程技术网

C# 为什么不是';编码密钥是否等于原始密钥?

C# 为什么不是';编码密钥是否等于原始密钥?,c#,encryption,encoding,aes,C#,Encryption,Encoding,Aes,语言:C#,框架:.NET核心3.1 我使用的加密基于 研究: Gilles:AES密钥只是一堆没有结构的比特。 密钥和IV需要存储,因为它们每次都是随机生成的,需要进行加密和解密。 出于特殊原因,我需要将其存储为字符串,因此我希望能够将字节数组转换为字符串,并在需要时使用编码向后转换。 转换使用UTF-8编码进行 我的问题: 我在代码中设置了一个断点,字节数组的内容显然与原始数组不同。我尝试过切换到其他编码格式,但也失败了。简而言之,数据发生了更改,这将导致无法解密消息,因为AES密钥和I

语言:C#,框架:.NET核心3.1

我使用的加密基于

研究:

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

密钥和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.");
    }
}
使用(Aes myAes=Aes.Create())
{
bool valid=false;
byte[]keyBytes=myAes.Key;
编码utf8WithoutBom=新的UTF8编码(真);
string key=utf8WithoutBom.GetString(keyBytes);
byte[]outputBytes=utf8WithoutBom.GetBytes(键);
if(myAes.Key.Length==outputBytes.Length){
for(int i=0;i
结果:
-输出:字节[],大小在50~54之间
错误

-所需输出:字节[32]与原始数组具有相同的数据
success


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

只有当初始字节数组包含有效的utf8内容时,从
字节[]->字符串->字节[]的转换才会起作用。并非每个32字节数组都会这样做

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


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

将一个字节[]与另一个字节进行比较,结果为==如果实例不相同,该值将始终返回false。因此,即使字节数组的内容在这里很可能是相同的,但您还是失败了。我想询问数据库字段的大小,因为使用ASCII编码的键和IV将使它们成为混乱的文本。String不是存储字节的好类型,但是有BitConverter.ToString()例如,它将创建一个更可读的字符串,如F7-04-A1-84-…,它不仅更易于读取,而且还可以转换回byte[],而无需任何编码问题。这就是为什么:)我可以建议一种更好的方法来存储密钥吗?就像我第二次评论中的那个?我认为你的假设是错误的。您尝试的utf8转换仅在keyBytes包含有效的utf8数据时才起作用。但并非所有可能的字节数组都能做到这一点。如果keyBytes包含无效数据,则字节[]->字符串转换已产生无意义(或某些回退值)。将其转换回这些回退值的字节数组。使用Base64或类似代码将任意一组字节编码为字符串,而不是UTF8/UTF。