1

この問題は、プログラミングの問題というよりも数学的な問題です。ライセンスキーをデコードし、その正しさをチェックする機能があります。

コードを参照してください:

ushort local6 = rand1;    // generated random = 0x2ff2
ushort local1 = rand2;    // = 0x780e
ushort local8 = rand3;    // = 0x1e3c
ushort local4 = rand4;    // = 0xf521
ushort temp1 = 0;    // always zero
ushort temp2 = 0;    // always zero

// THIS loop
for (int i = 0; i < 8; i++)
{
    local6 += stack2[0 + 6 * i];
    local1 += stack2[1 + 6 * i];
    local8 += stack2[2 + 6 * i];
    local4 += stack2[3 + 6 * i];
    temp1 = (ushort)(local6 ^ local8);
    temp1 += stack2[4 + 6 * i];
    temp2 = (ushort)((local1 ^ local4) + temp1);
    temp2 += stack2[5 + 6 * i];
    temp1 += temp2;
    local6 = (ushort)(local6 ^ temp2);
    local4 ^= temp1;
    temp1 ^= local1;
    local1 = (ushort)(local8 ^ temp2);
    local8 = temp1;
}

// Results after loop:
// local6 = 0x518a
// local1 = 0x33e5
// local8 = 0x8bca
// local4 = 0x57de

// validate date, checksums etc.
if (_validate(local6, local8, local1, local4))
    return "Key " + rand1 + "-" + "rand2" + "-" + "rand3" + "-" + "rand4" + " is valid!";
else
    return "Key invalid!";

簡単にするために、次のように仮定します。

ushort[] stack2 = new ushort[52];

for (int i = 0; i < stack2.Length; i++)
{
    stack2[i] = (ushort)i;
}

質問は; このループは可逆的ですか?つまり、値を取得することは可能ですか

rand1, rand2, rand3, rand4 

ループ後に取得した値から:

local6, local1, local8, local4 

ループ関数のコードを知っている?私はこれが不可能だと確信していますが、あなたがこれについてどう思うか知りたいです.

私が共有しているコードは私の発明であり、この種のループは、リバース エンジニア (シリアル クラッカー) がブルートフォースしない限り、優れた保護になると心から信じています。

4

2 に答える 2

1

これを Z3 のような SMT ソルバーに入れてみます。スタックは定数に置き換えることができます。temp2もすべての点で一定です。逆転を困難にする唯一のものはtemp2. うまくいけば、SMT ソルバーはそれを処理できます。

回転が見られないので、ここでは拡散がかなり低いと思われます。

また、元に戻すのがより簡単になるのは、繰り返しごとにループ内でtemp1とが再初期化されることです。temp2それらが計算全体に沿って運ばれた場合、それはより困難になります。

のような暗号化ハッシュを使用しないのはなぜSHA256ですか?

于 2013-09-01T18:16:44.467 に答える
1

難しいかもしれませんが、理論的な一方向計算は見当たりません。すべてが可逆的に見える。

于 2013-09-01T18:44:55.637 に答える