【发布时间】:2014-01-20 03:50:34
【问题描述】:
我可以访问一些我正在尝试将其转换为 VB.NET 的 VC++ 源代码。我之前问过一个关于位移的问题,虽然给出的答案是有道理的,而且转换到 VB.NET 似乎相当简单,但我很难解决问题。这是我需要转换为 VB.NET 的一些 VC++ 代码:
#define bitShift(_val) \
((u64)(((((u64)_val) & 0xff00000000000000ull) >> 56) | \
((((u64)_val) & 0x00ff000000000000ull) >> 40) | \
((((u64)_val) & 0x0000ff0000000000ull) >> 24) | \
((((u64)_val) & 0x000000ff00000000ull) >> 8 ) | \
((((u64)_val) & 0x00000000ff000000ull) << 8 ) | \
((((u64)_val) & 0x0000000000ff0000ull) << 24) | \
((((u64)_val) & 0x000000000000ff00ull) << 40) | \
((((u64)_val) & 0x00000000000000ffull) << 56)))
现在,返回值将用作 CTR 模式下 AES 解密的计数器。下面的VC++代码用于计算计数器:
u8 counter[16];
*(u64 *)(counter + 0) = bitShift(i);
*(u64 *)(counter + 8) = 0;
这是我目前使用 VB.NET 代码的地方:
Public Function SwapBits(ByVal value As Int64) As Int64
Dim uvalue As UInt64 = CULng(value)
Dim swapped As UInt64 = ((&HFF00000000000000UL) And (uvalue >> 56) Or _
(&HFF000000000000L) And (uvalue >> 40) Or _
(&HFF0000000000L) And (uvalue >> 24) Or _
(&HFF00000000L) And (uvalue >> 8) Or _
(&HFF000000UI) And (uvalue << 8) Or _
(&HFF0000) And (uvalue << 24) Or _
(&HFF00) And (uvalue << 40) Or _
(&HFF) And (uvalue << 56))
Return CLng(swapped)
End Function
这是用于创建计数器的代码:
Dim blocks As Integer = file_size / 16
For i As Integer = 0 To blocks - 1
Dim buffer As Byte() = New Byte(15) {}
Array.Copy(BitConverter.GetBytes(SwapBits(CULng(i))), 0, buffer, 0, 8)
'AES decryption takes place after this...
计数器为 16 个字节,但只有前 8 个字节使用 AES 128 位 EBC 加密,然后与当前加密的数据块(也是 16 个字节)进行异或运算(AES CTR 模式)。我可以让代码在没有任何错误的情况下运行,但是解密数据的输出不正确,这让我相信我没有正确计算用于加密的计数器。
再次感谢任何帮助,并提前致谢!
编辑:当前的 SwapBits 功能......虽然仍然不正确
Public Function SwapBits(ByVal uvalue As UInt64) As UInt64
Dim swapped As UInt64 = ((((uvalue) And &HFF00000000000000) >> 56) Or _
(((uvalue) And &HFF000000000000) >> 40) Or _
(((uvalue) And &HFF0000000000) >> 24) Or _
(((uvalue) And &HFF00000000) >> 8) Or _
(((uvalue) And &HFF000000) << 8) Or _
(((uvalue) And &HFF0000) << 24) Or _
(((uvalue) And &HFF00) << 40) Or _
(((uvalue) And &HFF) << 56))
Return swapped
End Function
这实际上会导致“算术运算导致溢出”。当 uvalue 达到 128 时出错。当将 1 的值传递给 SwapBits 时,我的返回值 = 72057594037927936。我对 VC++ 代码的解释是,我的计数器应该只是一个 16 字节数组,每次递增 1。例如,如果
uvalue = 1
那么我的计数器需要是
0000000100000000
如果
uvalue = 25
那么我的计数器需要是
0000002500000000
等等,等等……或者我在某处误解了什么?
【问题讨论】:
-
尝试用括号将每个 And 表达式组合在一起,因为这是 C++ 代码的编写方式。
-
@tinstaafl,仍然得到相同的错误输出。不过感谢您的建议。
-
另一件事我注意到 c++ 代码中的十六进制数字都是相同的,但是在 vb 代码中它们的转换方式不同。通过不将它们全部相同,它们将具有不同的位数。
-
仍然得到相同的结果。十六进制的前 16 个字节应为“00 00 00 52 45 17 AF E5 00 00 00 00 45 17 AF E5”,我得到“06 8E B4 6B 33 B7 7F E7 93 1A 45 E1 24 6C F5 01”。开始怀疑计数器是否实际上没有被错误地计算,并且可能还有其他问题。
-
再次查看您的代码,在我看来您的十六进制数字和 uvalue 向后。尝试移动十六进制数并与 uvlaue 进行 ANDing
标签: vb.net visual-c++ aes code-conversion aescryptoserviceprovider