2013-02-19 32 views
3

长度16 I有一个要求创建具有长度为16(即具有128位被用作在AES加密密钥的字节数组)一个byte[]如何创建字节[]使用FromBase64String

下面是一个有效的字符串

"AAECAwQFBgcICQoLDA0ODw==" 

什么是确定一个字符串是否为128位的算法?或者试验和错误是创建这种128位字符串的唯一方法?

CODE

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位,我们需要6分之256= 42.66字符。这是舍入到43个字符。 [为了使它被4整除添加=]

对于512位,我们需要六分之五百十二= 85.33字符。这是四舍五入到86个字符。 [为了使它被4整除添加==]

对于128位,我们需要6分之128= 21.33字符。这是舍入到22个字符。 [使其可被4整除==]

+1

如果你可以使用GPL代码(即你在GPL下发布),你可能想看看它有大量的实用工具类和东西对付键KeePass的源代码(www.keepass.info)。 – Philipp 2013-02-19 09:43:40

回答

6

为16个字节一个base64字符串将总是24个字符,并且具有==在端部,作为填充。

(在当它的可解码使用.NET方法,该填充并不总是inlcuded以base64串的所有用途,但.NET实现需要它。至少)

+0

谢谢,使最后两个字符为'=='的窍门。什么是32字节长度的逻辑[]? – Lijo 2013-02-19 09:58:35

+2

一个字节使用4/3个字符,所以x个字节使用'(x * 4 + 2)/ 3'数据字符。对于43个字符的32个字节,然后它有一个'='将它填充到甚至四个字符的边界。 – Guffa 2013-02-19 10:35:14

0

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

+0

@Lijo要检查一个字符串是否为128位,只需检查长度是否为16(因此一个字符== 8位,因此16x8 = 128位) – dutzu 2013-02-19 09:44:15

3

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

每个char是等于数据的原始6位,所以,以产生8比特值的串长度具有由4〜整除没有余数。 (6位* 4 = 8位* 3)。当生成的BASE64字符串短于4n时,则在末尾添加'='以使其有效。

更新

最后一个字符之前“==”编码只有2比特的信息,因此通过所有可能的Base64编码字符替换它会给你只有4个不同的密钥出来的64种可能的组合。换句话说,通过生成格式为“bbbbbbbbbbbbbbbbbbbbbbb ==”(其中“b”是有效的Base64字符)的字符串,每个唯一密钥将得到15个重复密钥。

+0

当有22个字符和'=='时,它按照@Guffa的建议工作。那么它应该是22 * 6 = 132位,不是吗?它是如何变成128位的? – Lijo 2013-02-19 09:57:48

+1

@Lijo Base64用于编码字节。所以132/8 = 16.5字节,这实际上是16字节。为了校准需要16 * 8 - 128位数据和0.5 * 8 = 4'零'位。换句话说,最后一个字符中只有2位用于存储数据,其余4位存在,因为你不能有2位字符。 – Artemix 2013-02-19 10:41:38

+0

对于256位,我们需要256/6 = 42.66个字符。这是43个字符...... [并且使它可以被4整除加上一个'='。]不是吗? – Lijo 2013-02-19 11:05:25