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)

lng代码是whole number * 15 + 5. 因此,当减去 5 时,它总是能被 15 整除的数字。这意味着如果 accessCode - 5 不能被 15 整除,ValidateKey 将始终返回 false!

例如, if accessCodeis 15000,无论是什么都ValidateKey将返回!因为没有一个整数为真,所以它永远不会返回。falseaccessKeyi*15+5 = 15000true

这就是为什么它不适用于例如 65536 的原因,不是因为您使用了错误的密钥,而是因为无论密钥如何,对于 code = 65536 它将始终返回 false。我的函数返回哪个键并不重要,ValidateKey 将返回 false。

另一方面,对于像 6005(6005 - 5 可被 15 整除)这样的数字,我的函数计算的键将被成功验证。

结论:

您可以使用我的函数为足够大的 N 生成密钥,其中 N-5 可以被 15 整除。

对于那些 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 回答