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

问题描述 投票:4回答:1

语言。 C#, .NET核心3.1 .NET Core 3.1

我正在使用基于加密的 AES.

研究: 密钥格式AES

吉勒 一个AES密钥只是一堆没有结构的比特。

密钥和IV需要被存储,因为它们每次都是随机生成的,而且加密和解密都需要它们。

由于特殊的原因,我需要将其存储为一个字符串,所以我希望能够将一个字节数组转换为一个字符串,如果需要的话,还可以使用编码进行反向转换。

转换是通过使用 UTF-8 编码。

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

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

例子:

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.");
    }
}

结果:输出:字节[],大小在50~54之间。 - 输出:大小在50~54之间的字节[]。Error - 希望的输出:字节[32],数据与原始数组相同。Succes

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

c# encryption encoding aes
1个回答
1
投票

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

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

如果你想把一个任意的字节数组编码成一个字符串,使用 基数64 或其他通用数据编码,但不是utf8。

© www.soinside.com 2019 - 2024. All rights reserved.