0

我可以访问一些我试图将其转换为 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

等等等等……或者我在某处误解了某些东西?

4

2 回答 2

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 || &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 时将计数器的前 8 个字节递增 1 i,从最右边的字节开始,每次结转时向左扩展。例如,如果计数器达到 999,counter[7] 将保持 231(&HE7) 和 counter[6] 3(&H3),当你查看整个数组时,&H000000000003E7 等于 999 十进制。

于 2014-01-20T15:50:16.627 回答
0

有些事情告诉我,使用GetBytesToUInt64()方法、for循环和临时变量可以更好地完成转换。对于大多数目的,它会更容易阅读并且可能足够快。

于 2014-01-20T17:03:07.850 回答