3

我需要创建一个byte[]长度为 16 的字节数组。(在 AES 加密中用作密钥的 128 位字节数组)。

以下是一个有效的字符串

"AAECAwQFBgcICQoLDA0ODw=="

确定字符串是否为 128 位的算法是什么?还是反复试验是创建这种 128 位字符串的唯一方法?

代码

    static void Main(string[] args)
    {
        string firstString = "AAECAwQFBgcICQoLDA0ODw=="; //String Length = 24
        string secondString = "ABCDEFGHIJKLMNOPQRSTUVWX"; //String Length = 24
        int test = secondString.Length;

        byte[] firstByteArray = Convert.FromBase64String((firstString));
        byte[] secondByteArray = Convert.FromBase64String((secondString));

        int firstLength = firstByteArray.Length;
        int secondLength = secondByteArray.Length;


        Console.WriteLine("First Length: " + firstLength.ToString());
        Console.WriteLine("Second Length: " + secondLength.ToString());

        Console.ReadLine();
    }

调查结果

对于 256 位,我们需要 256/6 = 42.66 个字符。这是四舍五入到 43 个字符。[使它可以被 4 整除=]

对于 512 位,我们需要 512/6 = 85.33 个字符。这是四舍五入到 86 个字符。[使它可以被 4 整除==]

对于 128 位,我们需要 128/6 = 21.33 个字符。这是四舍五入到 22 个字符。[使它可以被 4 整除==]

4

3 回答 3

6

16 个字节的 base64 字符串将始终为 24 个字符,并==在结尾处作为填充。

(至少当它可以使用 .NET 方法解码时。填充并不总是包含在 base64 字符串的所有使用中,但 .NET 实现需要它。)

于 2013-02-19T09:43:24.143 回答
3

在 Base64 编码中,'=' 是一个特殊符号,添加到 Base64 字符串的末尾,表示这些字符在原始值中没有数据。

每个 char 等于 6 个原始数据位,因此要生成 8 位值,字符串长度必须可被 4 整除而没有余数。(6 位 * 4 = 8 位 * 3)。当生成的 BASE64 字符串短于 4n 时,在末尾添加 '=' 以使其有效。

更新

'==' 之前的最后一个字符仅编码 2 位信息,因此通过将其替换为所有可能的 Base64 字符将只为您提供 64 种可能组合中的 4 个不同键。换句话说,通过生成格式为 "bbbbbbbbbbbbbbbbbbbbbb==" 的字符串(其中 'b' 是有效的 Base64 字符),每个唯一键将获得 15 个重复键。

于 2013-02-19T09:47:44.887 回答
0

您可以使用 PadRight() 使用 char 将字符串填充到其末尾,稍后您将在解密后将其删除。

于 2013-02-19T09:41:02.807 回答