1

有人可以用外行的术语解释这个 C# 代码的工作原理吗?

for (int pos = 0; pos < EncryptedData.Length; pos += AesKey.Length);
{
    Array.Copy(incPKGFileKey, 0, PKGFileKeyConsec, pos, PKGFileKey.Length);

    IncrementArray(ref incPKGFileKey, PKGFileKey.Length - 1);
}

private Boolean IncrementArray(ref byte[] sourceArray, int position)
{
    if (sourceArray[position] == 0xFF)
    {
        if (position != 0)
        {
            if (IncrementArray(ref sourceArray, position - 1))
            {
                sourceArray[position] = 0x00;
                return true;
            }
            else return false;
        }
        else return false;
    }
    else
    {
        sourceArray[position] += 1;
        return true;
    }
}

我正在尝试将应用程序移植到 Ruby,但我无法理解 IncrementArray 函数的工作原理。

4

2 回答 2

1

IncrementArray递增字节数组的所有条目,并将任何溢出添加到前一个索引,除非它已经是索引 0。整个事情看起来像是某种加密或解密代码。您可能想寻找有关使用哪种算法的其他提示,因为这种代码通常无法自我解释。

于 2013-02-14T19:25:48.593 回答
0

在我看来,它就像一个大端加法算法:

假设您有一个长(64 位,8 字节)数字:

var bigNumber = 0x123456FFFFFFFF;

但由于某种原因,我们将它作为大端格式的字节数组提供给我们:

// Get the little endian byte array representation of the number: 
// [0xff 0xff 0xff 0xff 0xff 0x56 0x34 0x12]
byte[] source = BitConverter.GetBytes(bigNumber);

// BigEndian-ify it by reversing the byte array
source = source.Reverse().ToArray();

因此,现在您想以当前形式向该“数字”添加一个,同时保持任何进位/溢出,就像在正常算术中一样:

// increment the least significant byte by one, respecting carry
// (as it's bigendian, the least significant byte will be the last one)
IncrementArray(ref source, source.Length-1);

// we'll re-little-endian-ify it so we can convert it back
source = source.Reverse().ToArray();

// now we convert the array back into a long
var bigNumberIncremented = BitConverter.ToInt64(source, 0);

// Outputs: "Before +1:123456FFFFFFFF"
Console.WriteLine("Before +1:" + bigNumber);      

// Outputs: "After +1:12345700000000"
Console.WriteLine("After +1:" + bigNumberIncremented);
于 2013-02-14T19:50:14.673 回答