PHP许可证密钥生成器

fjnneemd  于 2023-01-08  发布在  PHP
关注(0)|答案(4)|浏览(204)

我正在寻找一种方法,通过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。我想添加一些信息到关键的电子邮件用户,然后将其传递到客户端(空气应用程序),解密数据和应用程序中的dysplay。
有可能吗?

kmbjn2e3

kmbjn2e31#

好吧,让我们分解一下您的问题:
您希望:
1.在密钥中添加一些信息
那么你想添加什么信息呢?你想在添加的时候增加密钥的长度吗?你想让这些信息需要密钥来解密吗?从最大的意义上说,这在PHP中是完全可能的
1.电子邮件用户
PHP有一个mail()函数,它几乎可以正常工作。
1.然后传递给客户端(Air应用程序)
air应用程序是否通过http请求调用这个php脚本?如果是,设置content-type并输出它的键。
1.解密数据返回到第1点,可以,但您是否需要密钥,以及是否关心格式是否更改。此外,您不想在AS 3应用程序中解密数据吗?
1.如果AS 3应用程序要显示密钥或解密数据,则需要在AS 3中获取它以显示数据。

wj8zmpe1

wj8zmpe12#

如果您只想存储一些信息,但使用上面使用的符号集(0-9A-Z)对其进行“编码”,则可以使用下面的算法。
这段代码是我的一个Python(3)老程序。它肯定不怎么花哨,也没有经过很多测试,但我想有总比没有好,因为你还没有得到很多答案。将代码移植到PHP或AS应该很容易。例如,reduce语句可以替换为命令式循环。还要注意,//在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!
vu8f3i0k

vu8f3i0k3#

使用md5你不能这样做,因为这是一个单向散列。你应该使用一个解密方法来这样做,因为它使用一个密钥来编码和解码它。有几个php扩展可以这样做,请参考php手册。你也可以使用第三方软件来这样做,例如http://wwww.phplicengine.com

t3psigkw

t3psigkw4#

我用Python在Andre's answer中找到了值。
我和问题的作者一样,需要一个php解决方案,所以我把Andre的代码重写为PHP。我把它贴在这里,以防其他人发现它有用。

然而,Python版本中不存在这样的限制:

似乎编码任何大于8个字符的字符串。它可能是可解的吗?这与PHP如何处理非常大的整数有关。谢天谢地,我只需要编码少于8个字符的字符。它可能在不同的环境下工作,我不确定。无论如何,在说明了这个警告后,下面是这个类:

<?php

/**
 * Basic key generator class based on a simple Python solution by André Laszlo.
 * It's probably not secure in any way, shape or form. But may be suitable for
 * your requirements (as it was for me).
 *
 * Due to limitations with PHP's processing of large integers, unlike the Python
 * app, only a small amount of data can be encoded / decoded. It appears to
 * allow a maximum of 8 unencoded characters.
 *
 * The original Python app is here: https://stackoverflow.com/a/6515005
 */

class KeyGen
{
    /**
     * @var array
     */
    protected $alphabet;

    /**
     * @var int
     */
    protected $groups;

    /**
     * @var string
     */
    protected $separator;

    /**
     * Controller sets the alphabet and group class properties
     *
     * @param  string $alphabet
     * @param  int $groups
     * @param  string $separator
     */
    public function __construct(string $alphabet = null, int $groups = 4, string $separator = '-')
    {
        $alphabet = $alphabet ?: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $this->alphabet = str_split($alphabet);
        $this->groups = $groups;
        $this->separator = $separator;
    }

    /**
     * Encodes a string into a typical license key format
     *
     * @param  string $txt
     * @return string
     */
    public function encode(string $txt)
    {
        // calculate the magic number
        $asciiVals = array_map('ord', str_split($txt));
        $num = array_reduce($asciiVals, function($x, $y) {
            return ($x * 256) + $y;
        });

        // encode
        $a = [];
        $i = 0;
        $n = count($this->alphabet);
        while ($num > 0) {
            $i = $num % $n;
            array_push($a, $this->alphabet[$i]);
            $num -= $i;
            $num = intdiv($num, $n);
        }

        // add padding digits
        $str = implode('', $a);
        if($this->groups > 0) {
            while (strlen($str) % $this->groups != 0) {
                $str .= $this->alphabet[0];
            }
        }

        // split into groups
        if($this->groups) {
            $split = str_split($str, $this->groups);
            $str = implode($this->separator, $split);
        }

        return $str;
    }

    /**
     * Decodes a license key
     *
     * @param  string $txt
     * @return string
     */
    public function decode(string $txt)
    {
        // remove separators and padding
        $stripped = str_replace($this->separator, '', $txt);
        $stripped = rtrim($stripped, $this->alphabet[0]);

        // get array of alphabet positions
        $alphabetPosistions = [];
        foreach(str_split($stripped) as $char){
            array_push($alphabetPosistions, array_search($char, $this->alphabet));
        }

        // caluculate the magic number
        $alphabetPosistions = array_reverse($alphabetPosistions);
        $num = array_reduce($alphabetPosistions, function($x, $y) {
            $n = count($this->alphabet);
            return ($x * $n) + $y;
        });

        // decode
        $a = [];
        $i = 0;
        $n = count($this->alphabet);
        while ($num > 0) {
            $i = $num % 256;
            array_push($a, $i);
            $num -= $i;
            $num = intdiv($num, 256);
        }

        return implode('', array_map('chr', array_reverse($a)));
    }

}

这里是一个例子用法,编码和解码“ABC123”:

$keyGen = new KeyGen();

$encoded = $keyGen->encode('ABC123'); //returns 3WJU-YSMF-P000

$decoded = $keyGen->decode('3WJU-YSMF-P000'); //returns ABC123

相关问题