是否有比Unicode转换更好的方式将AES IV转换为字符串并返回?

时间:2018-02-06 18:08:32

标签: c# unicode

我正在尝试在文本文件中存储用于AES加密的IV。

基于这篇文章: Storing/Converting the encryption key and IV as strings

我应该将字节数组转换为base64字符串。

根据这个:How to convert string to base64 byte array, would this be valid?

我应该使用Encoding.ASCII.GetBytes来执行此操作。

但是,当我尝试再次设置向量时,使用保存的字符串,它会抛出一个异常,告诉我它与块大小不匹配。

以下是相关代码:

    internal static void OutputProviderKeyAndVector()
    {
        try
        {
            string s = 
                Convert.ToBase64String(m_Aes.Key) 
                + ":" + 
                Convert.ToBase64String(m_Aes.IV);

            File.WriteAllText(m_FileName, s);
        }

        catch(Exception e) { Console.WriteLine(e.ToString()); }
    }

    internal static void InitializeProviderWithKey(string key, string iv)
    {
        try
        {
            m_Aes = new AesCryptoServiceProvider();

            m_Aes.BlockSize = 128;
            m_Aes.KeySize = 256;
            m_Aes.IV = Encoding.ASCII.GetBytes(iv);
            m_Aes.Key = Encoding.ASCII.GetBytes(key);
            m_Aes.Mode = CipherMode.CBC;
            m_Aes.Padding = PaddingMode.PKCS7;
        }

        catch(Exception e) { Console.WriteLine(e.ToString()); }
    }

基于我上面提到的两个帖子,我希望这可行。但是,为IV创建的字节数组长度为16个字节,转换后它的长度为24个字节,因此转换显然不起作用。

所以,我去寻找另一个解决方案。

我遇到了这个问题:How do I get a consistent byte representation of strings in C# without manually specifying an encoding?

在这个问题中,最多投票和选择正确的答案提供了两种方法,基于对答案的评论,这两种方法是Encoding.Unicode.GetStringEncoding.Unicode.GetBytes的“重新实现”。 / p>

所以,我尝试了unicode转换。

    internal static void OutputProviderKeyAndVector()
    {
        try
        {
            string s = 
                Encoding.Unicode.GetString(m_Aes.Key) 
                + ":" +
                Encoding.Unicode.GetString(m_Aes.IV);

            File.WriteAllText(m_FileName, s);
        }

        catch(Exception e) { Console.WriteLine(e.ToString()); }
    }

    internal static void InitializeProviderWithKey(string key, string iv)
    {
        try
        {
            m_Aes = new AesCryptoServiceProvider();

            m_Aes.BlockSize = 128;
            m_Aes.KeySize = 256;
            m_Aes.IV = Encoding.Unicode.GetBytes(iv);
            m_Aes.Key = Encoding.Unicode.GetBytes(key);
            m_Aes.Mode = CipherMode.CBC;
            m_Aes.Padding = PaddingMode.PKCS7;
        }

        catch(Exception e) { Console.WriteLine(e.ToString()); }
    }

低,请注意,这是有效的,从某种意义上说,我可以生成向量字节数组并将其保存为字符串,可以再次用于加密和解密。

但是,对答案的另一个评论指出:

  

GetStringGetBytes需要在具有相同功能的系统上执行   终结工作。

这让我相信,如果它们实际上是重新实现的话,那么unicode转换也可能受到这个规定的约束。

所以,我的问题是,有没有更好的方法将AES IV转换为字符串并返回?当我说得更好时,我的意思是至少不受上述条款规定的约束。充其量,也许是我不熟悉的行业标准。

0 个答案:

没有答案