3

私は、ソフトウェアのキーを生成するアプリの (自動化の目的で) オンライン バージョンを作成する任務を負っています。

各ソフトウェアはユーザーに (システム ボリューム情報からの) アクセス コードを表示し、そのコードのキーは小さなアプリによって生成されます。たとえば、クライアントがアクセス コード: 123 を入力すると、キー: 321 が返されます。

問題は、この特定のソフトウェアのキーを生成する小さなアプリのソースが見つからないことですが、検証機能はあります

Public Function ValidateKey(AccessCode As Long, AccessKey As Long)

    Dim lngNewKey As Double
    Dim strHexKey As String
    Dim btCode(1) As Byte
    Dim lngCode As Long

    If AccessKey = 0 Then
        ValidateKey = False
        Exit Function
    End If

    If AccessCode = 0 Then
        ValidateKey = False
        Exit Function
    Else
        lngNewKey = AccessKey
        strHexKey = Hex(lngNewKey)
        If Len(strHexKey) = 5 Then strHexKey = "0" & strHexKey
        btCode(0) = CByte("&H" & Mid(strHexKey, 1, 2))
        btCode(1) = CByte("&H" & Mid(strHexKey, 5, 2))
        lngCode = CLng(btCode(0)) * 256 + CLng(btCode(1))
        lngCode = lngCode * 15 + 5
        ValidateKey = (lngCode = AccessCode)
    End If

End Function

この関数はクライアント ソフトウェアで実行され、ユーザーによって提供されたキー (AccessKey) が AccessCode と比較して正しいかどうかをチェックします。

そのため、キーを生成する関数を見つけるために、次のようにして元に戻しました。

AccessCode = AccessCode - 5
AccessCode = AccessCode / 15

しかし、前の操作はハッシュ操作のように見え、元に戻すのが難しいように見えるため、行き詰まりました。

次のデータがあります(スタンドアロンのキー生成アプリを使用して):

for accesscode 111440 the key should be 1946629
for accesscode 200000 the key should be 3453973
for accesscode 65536 the key should be 1160209
for accesscode 8192 they key should be 177186
for accesscode 4096 they key should be 111633

動作する最小のアクセスコードは 3838 です。

キー生成関数を導出することが可能かどうか疑問に思っていました。

前もって感謝します

4

2 に答える 2

2

これはうまくいくはずです。例と同じアクセスキーは提供されませんが(お気づきのように、逆のプロセスがあいまいです)、検証機能に合格するアクセスキーが提供されます。C#、VBはわかりません。

    static int Key(int accessCode)
    {
        accessCode = (accessCode - 5) / 15;
        return Int32.Parse(((accessCode >> 8) & 0xFF).ToString("X")
                          + "00"
                          + (accessCode & 0xFF).ToString("X").PadLeft(2, '0'),              
                           System.Globalization.NumberStyles.HexNumber);
    }

たとえば、キー ペアは次のとおりです。

(111440, 1946629)

私の関数は次のようになります:

(111440, 1900549)

どちらも正常に検証されます。

編集:あなたの例の小さな数字(65536以下)は、私にとってはうまく検証されないことがわかります(正しいキーでも計算されたキーでもありません)。つまり、検証関数を C# に正しく変換していませんでした (おそらく小さな数値のパディングと関係があります)。しかたがない。これは、これらの値に対して Key 関数が正しく機能しないことを意味する場合とそうでない場合があります。ValidateKey が正しくないため、テストできません。

Edit2: 実際、問題は私の翻訳ではありませんでした。問題は、独自の ValidateKey 関数が、あなたが言うことを実行しないことです。VBで直接コピーアンドペーストしてテストしたところ、次のように返されました。

  1. 111440 1946629 -> 真
  2. 200000 3453973 -> 真
  3. 65536 1160209 -> 偽
  4. 8192 177186 -> 偽
  5. 4096 111633 -> 偽

Edit3: ValidateKey 関数のバグは次のとおりです。

    lngCode = lngCode * 15 + 5
    ValidateKey = (lngCode = AccessCode)

lngCode はwhole number * 15 + 5. したがって、5 を引くと必ず 15 で割り切れる数になります。つまり、accessCode - 5 が 15 で割り切れない場合、ValidateKey は常に false を返します。

たとえば、 is の場合、accessCodeis が何15000であれValidateKey返されます! 真となる整数は存在しないため、 を返すことはできません。falseaccessKeyi*15+5 = 15000true

これが、たとえば 65536 では機能しない理由です。キーが間違っているからではなく、キーに関係なくコード = 65536 に対して常に false を返すためです。私の関数がどのキーを返すかは関係ありません。ValidateKey は false を返します。

一方、6005 のような数値 (6005 - 5 は 15 で割り切れる) の場合、my 関数が計算するキーは正常に検証されます。

結論:

my 関数を使用すると、N-5 が 15 で割り切れる十分な大きさの N のキーを生成できます。

15 が N-5 を割り切らない数値の場合、ValidateKey が true を返さないため、キーを生成することはできません。

于 2013-06-21T14:55:45.927 に答える
-1

互換性のあるキーを返す関数を次に示します。

Public Function CreateKey(ByRef AccessCode As Long) As Long
    Dim tempcode As Long = CLng((AccessCode - 5) / 15)
    AccessCode = tempcode * 15 + 5
    Dim Hexout As String
    Hexout = Hex(tempcode / 256).PadLeft(2, "0"c) + "B4" + Hex(tempcode - (Math.Truncate(tempcode / 256) * 256)).PadLeft(2, "0"c)
    CreateKey = Convert.ToInt32(Hexout, 16)
End Function

生成されたキーと互換性があるように AccessCode を変更することにより、検証関数は常に機能します。または、アクセスコードを作成する関数でそれを条件にすることもできます。

于 2013-06-22T06:20:22.180 に答える