我可以访问一些我试图转换为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
等等......或者我在某处误解了什么?
答案 0 :(得分:1)
不确定您对C ++代码的期望。但是当我使用它时:
#include <iostream>
using namespace std;
#define bitShift(_val) \
((unsigned __int64)(((((unsigned __int64)_val) & 0xff00000000000000ull) >> 56) | \
((((unsigned __int64)_val) & 0x00ff000000000000ull) >> 40) | \
((((unsigned __int64)_val) & 0x0000ff0000000000ull) >> 24) | \
((((unsigned __int64)_val) & 0x000000ff00000000ull) >> 8 ) | \
((((unsigned __int64)_val) & 0x00000000ff000000ull) << 8 ) | \
((((unsigned __int64)_val) & 0x0000000000ff0000ull) << 24) | \
((((unsigned __int64)_val) & 0x000000000000ff00ull) << 40) | \
((((unsigned __int64)_val) & 0x00000000000000ffull) << 56)))
int main()
{
unsigned __int64 test = bitShift(25);
return 0;
}
我得到完全相同的返回值(1801439850948198400 ||&amp; H1900000000000000):
Dim result As ULong = SwapBits(25)
Public Function SwapBits(ByVal uvalue As UInt64) As UInt64
Dim swapped As UInt64 = ((((uvalue) And &HFF00000000000000UL) >> 56) Or _
(((uvalue) And &HFF000000000000UL) >> 40) Or _
(((uvalue) And &HFF0000000000UL) >> 24) Or _
(((uvalue) And &HFF00000000UL) >> 8) Or _
(((uvalue) And &HFF000000UL) << 8) Or _
(((uvalue) And &HFF0000UL) << 24) Or _
(((uvalue) And &HFF00UL) << 40) Or _
(((uvalue) And &HFFUL) << 56))
Return swapped
End Function
我在C ++方面没有太多经验,小心分享这是在做什么:
u8 counter[16];
*(u64 *)(counter + 0) = bitShift(i);
*(u64 *)(counter + 8) = 0;
基本上,该代码段将每个迭代0f i
的计数器的前8个字节递增1,从最右边的字节开始,并为每个遗留物向左扩展。例如,如果计数器达到999,计数器[7]将保持231(&amp; HE7)和计数器[6] 3(&amp; H3),当你查看整个数组时,&amp; H000000000003E7等于999十进制。< / p>
答案 1 :(得分:0)
有些东西告诉我使用GetBytes和ToUInt64()方法,for
循环和临时变量可以更好地完成转换。它可以更容易阅读,并且可能足够快以达到大多数目的。