c#字节数组大小

时间:2011-09-04 23:00:20

标签: c# bytearray sizeof

我正在使用dll进行加密(des),由其他人编写.Dll包括encrypt,decyrpt类,并且这些类包括methods.Des需要8个字节(64位)密钥。我描述了一个密钥字符串。(a字符是一个字节)。然后编码字节。

        string keyText= "abcdefghsdsdfsdfsdf";

        UTF8Encoding encoding = new UTF8Encoding();

        byte[] keyfile = new byte[8];
        keyfile = UTF8Encoding.UTF8.GetBytes(keyValue);

以上方式,即使我描述了字节数组8的大小,字节数组溢出的大小,它也是字符串值的长度。

任何建议。 感谢。

3 个答案:

答案 0 :(得分:4)

要正确执行此操作,请查看PasswordDeriveBytes Class,然后选择其中一个重载方法。

是的,您必须选择Salt,但这可以是程序中的固定值。盐不必保密。

回答技术问题,而不是与安全相关的问题:

    byte[] keyfile = new byte[8];
    keyfile = UTF8Encoding.UTF8.GetBytes(keyValue)

此代码会创建 2 数组。第一个是8个字节,但会立即丢弃。 GetBytes()创建一个新的,具有它确定的大小。你需要哈希那个数组,然后你可以选择哈希的前8个,这就是PasswordDeriveBytes为你做的。

答案 1 :(得分:1)

将keyfile初始化为空字节数组没有意义。 GetBytes返回一个替换初始数组的新字节数组,它将根据需要对整个输入进行编码。

要获得8个字节的编码,为什么不提供前8个字符?它们都是ASCII,所以它们每个占用一个字节:

 byte[] keyfile = UTF8Encoding.UTF8.GetBytes(keyValue.Substring(0, 8));

更重要的是,如果您使用keyText作为密码来合成加密密钥,这是一个非常糟糕的主意。你只是在前八个之后丢弃任何密码字符。相反,使用某种形式的加密哈希将密码转换为密钥。我刚刚注意到Henk Holterman's answer指向适当的API。

答案 2 :(得分:0)

您已经创建了一个包含7个项目(而不是8个)的数组,但您根本没有使用该数组。 GetBytes方法返回一个新数组,并将该数组的引用放在变量中,将您创建的数组留给垃圾收集器。

如果要获取数组的前8个字节,请复制内容而不是替换数组:

string keyText= "abcdefghsdsdfsdfsdf";

UTF8Encoding encoding = new UTF8Encoding();

byte[] keyfile = new byte[8];
byte[] decoded = UTF8Encoding.UTF8.GetBytes(keyValue);

Array.Copy(decoded, keyfile, 8);