1

我刚刚将一个内部应用程序从 .Net 3.5 更新到 4。我在字符串编码方面遇到了一些问题。我有一个要添加到注册表的字符串。它被加密(作为字节数组),然后使用编码 windows-1252 转换为字符串。

当我将其从注册表中拉出时,我会测试长度。使用 VB.net 3.5.Length给我 23。使用 .Net 4 我得到 35。.Net 4 版本更长,但最后只有额外的空字符。这对解密过程的工作方式产生了影响。默认文本编码有什么变化吗?

.Net4 如下。.Net 3.5 版本相同,但没有填充 0

(0): 13
(1): 49
(2): 27
(3): 42
(4): 102
(5): 77
(6): 178
(7): 197
(8): 98
(9): 198
(10): 240
(11): 79
(12): 171
(13): 216
(14): 82
(15): 55
(16): 24
(17): 134
(18): 117
(19): 97
(20): 223
(21): 69
(22): 149
(23): 0
(24): 0
(25): 0
(26): 0
(27): 0
(28): 0
(29): 0
(30): 0
(31): 0
(32): 0
(33): 0

编辑:

所以注册表的输入有填充。似乎从注册表中获取它会导致不同的字符串。

我正在使用它从 Reg 中获取它:

Dim regKey As Microsoft.Win32.RegistryKey
regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(//Location, False)
val = poKey.GetValue(name)

所以我最简单的解决方案是在我添加字符串时去掉填充,但是关于它为什么不同的任何想法?

4

1 回答 1

1

使用 Encoding 类将包含随机二进制数据的 byte[] 转换为字符串从根本上是错误的,这是一种有损转换。然后让注册表尝试将 8 位编码字符串解释为有效的 utf-16 字符串,可能会加剧这种情况。结果将是相当不可预测的。

必须使用能够处理任意二进制数据的编码。像 Convert.ToBase64String()。

或者,更有效的是,将其作为二进制数据而不是字符串存储在注册表中,因此根本不需要转换。请注意采用 RegistryValueKind 的 RegistryKey.SetValue() 重载您对 RegistryValueKind.Binary 选项感兴趣。实际上不需要使用该重载,只需直接传递 byte[] 并且根本不尝试任何转换。

于 2013-06-06T10:31:56.120 回答