AES 128 CTR模式位移动以创建计数器



我可以访问一些我试图转换为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加密,然后用当前加密的数据块进行XOR,该数据也为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

这实际上导致"算术操作导致溢出"。当紫外线达到128时错误。当1的值传递给交换值时,我的返回值=72057594037927936。我对VC 代码的解释是我的计数器应该只是每次16个字节阵列增加1个。例如,如果

uvalue = 1

然后我的柜台需要

0000000100000000

如果

uvalue = 25

然后我的柜台需要

0000002500000000

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

不确定您对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; h19000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来方面:

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;

基本上,代码部分将计数器的前8个字节递增1个迭代0f i,从最合适的字节开始,每次结转的左图。例如,如果计数器到达999计数器[7]将保持231(&amp; he7)和计数器[6] 3(&amp; h3),当您查看整个阵列时,&amp; h000000000003e7等于999小数。/p>

某事告诉我,使用getBytes和touint64()方法, for循环和临时变量更好地进行了转换。它更容易阅读,并且可能足够快地用于大多数目的。

最新更新