我正在使用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的大小,字节数组溢出的大小,它也是字符串值的长度。
任何建议。 感谢。
答案 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);