PHP许可证密钥生成器

PHP许可证密钥生成器,php,actionscript-3,license-key,Php,Actionscript 3,License Key,我正在寻找一种方法,通过PHP脚本生成许可证密钥,然后将其传输到我的应用程序(Air,AS3),并在这个应用程序中正确读取数据。例如,下面是代码: <?php error_reporting(E_ALL); function KeyGen(){ $key = md5(mktime()); $new_key = ''; for($i=1; $i <= 25; $i ++ ){ $new_key .= $key[$i];

我正在寻找一种方法,通过PHP脚本生成许可证密钥,然后将其传输到我的应用程序(Air,AS3),并在这个应用程序中正确读取数据。例如,下面是代码:

<?php
  error_reporting(E_ALL);
  function KeyGen(){
     $key = md5(mktime());
     $new_key = '';
     for($i=1; $i <= 25; $i ++ ){
               $new_key .= $key[$i];
               if ( $i%5==0 && $i != 25) $new_key.='-';
     }
  return strtoupper($new_key);
  }
  echo KeyGen();
?>

生成的密钥如下:1AS7-09BD-96A1-CC8D-F106。 我想在key-e-mail用户中添加一些信息,然后将其传递给客户端(Air应用程序),解密数据并在应用程序中显示


可能吗?

好的,让我们把你的问题分解一下:

您想:

  • 在密钥中添加一些信息
    那么你想补充什么信息呢?执行此操作时,是否要使键变长?是否希望此信息需要密钥才能解密?从最重要的意义上讲,这在PHP中是完全可能的
  • 电子邮件用户
    PHP有一个函数。它几乎就是工作
  • 然后将其传递给客户端(Air应用程序)
    air应用程序是否通过http请求调用此php脚本?如果是,则设置内容类型并向其输出密钥
  • 解密数据 回到第1点,有可能,但您是否需要密钥,以及是否关心格式是否更改。另外,您不想解密AS3应用程序中的数据吗
  • 在应用程序中显示。 如果AS3应用程序要显示密钥或解密的数据,那么您需要在AS3中获取密钥以显示数据

  • 如果您只想存储一些信息,但使用上面使用的一组符号(0-9A-Z)对其进行“编码”,则可以使用下面的算法

    代码是我的一个老Python(3)程序。这当然不是什么花哨的东西,也不是经过测试的,但我想这总比什么都没有好,因为你还没有得到很多答案。将代码移植到PHP或AS应该很容易。例如,这些语句可以被命令式循环替换。还要注意,
    /
    在Python中表示整数除法

    对它进行一些压缩/加密也应该很容易。希望它和你想要的一样。来吧

    from functools import reduce
    
    class Coder:
        def __init__(self, alphabet=None, groups=4):
            if not alphabet:
                alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            self.alphabet = alphabet
            self.groups = groups
    
        def encode(self, txt):
            N = len(self.alphabet)
            num = reduce(lambda x,y: (x*256)+y, map(ord, txt))
    
            # encode to alphabet
            a = []
            while num > 0:
                i = num % N
                a.append(self.alphabet[i])
                num -= i
                num = num//N
    
            c = "".join(a)
            if self.groups > 0:
                # right zero pad
                while len(c) % self.groups != 0:
                    c = c + self.alphabet[0]
                # make groups
                return '-'.join([c[x*self.groups:(x+1)*self.groups]
                                 for x in range(len(c)//self.groups)])
            return c
    
        def decode(self, txt, separator='-'):
            # remove padding zeros and separators
            x = txt.rstrip(self.alphabet[0])
            if separator != None:
                x = x.replace(separator, '')
            N = len(self.alphabet)
            x = [self.alphabet.find(c) for c in x]
            x.reverse()
            num = reduce(lambda x,y: (x*N)+y, x)
    
            a = []
            while num > 0:
                i = num % 256
                a.append(i)
                num -= i
                num = num//256
            a.reverse()
            return ''.join(map(chr, a))
    
    if __name__ == "__main__":
        k = Coder()
        s = "Hello world!"
        e = k.encode(s)
        print("Encoded:", e)
        d = k.decode(e)
        print("Decoded:", d)
    
    示例输出:

    Encoded: D1RD-YU0C-5NVG-5XL8-7620
    Decoded: Hello world!
    

    对于md5,您不能这样做,因为这是一个单向散列。您应该使用解密方法来执行此操作,因为它使用密钥对其进行编码和解码。有几个php扩展可以做到这一点,请参阅php手册。您也可以使用第三方软件来实现这一点,例如

    Hmm,这真的不是那么容易,您需要拥有属于序列所有者的特定数据,以使其唯一化需要在“密钥”中存储多少字节数据?@RobertPitt。当然,密钥必须是唯一的。MD5是哈希函数,不是加密/解密类型的函数。但是,您可以使用base64进行“编码”(可能是供您使用的crypt),然后进行“解码”(在您使用时进行解密)。它很容易破产(只是说说而已),但如果它起作用,你为什么不使用它呢?请分享更多你的担忧,让它变得更加突出你真正想要的。你在实施这一点上有问题吗?您是否需要AS3和PHP中都存在的其他加密/描述函数?如何处理:将密钥中的电子邮件地址加上一些秘密散列。将MD5散列传递到应用程序并将其存储在数据库中。在使用数据库进行验证时,在响应中返回用户信息。让应用程序存储它以便以后显示。谢谢你,贾斯汀。1.我需要传递电子邮件地址(someclientmail@gmail.com),当前日期,一对随机数(用于在应用程序上检查-这是对密钥有效性的最简单测试)2。哦,不,我不需要这个功能。电子邮件我需要将其保存在数据库中。3.这就是我所知道和能做的。4.例如,我可以使用PHP&AS3-base64和MD5。5.例如显示电子邮件