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();

したがって、通常の算術演算と同様にキャリー/オーバーフローを維持しながら、現在の形式でこの「数値」に 1 を追加します。

// 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 に答える