Php 从数字和密码开始构建短密码

Php 从数字和密码开始构建短密码,php,encryption,Php,Encryption,我必须从一个递增的数字(1到50000)和一个秘密密码开始构建50000个代码。我必须在php中完成,最后的代码必须是8或12个字符长,并且只包含大写字母(A-Z)和数字(0-9) 最后的代码必须是可以用密码解密的 我正在尝试使用openssl_encrypt,但我找不到一种方法使最终代码“简短” $longCode = openssl_encrypt($number, $method, ENC_KEY, true, $iv); $shortCode = ..... 一些想法?试试这个: //

我必须从一个递增的数字(1到50000)和一个秘密密码开始构建50000个代码。我必须在php中完成,最后的代码必须是8或12个字符长,并且只包含大写字母(A-Z)和数字(0-9)

最后的代码必须是可以用密码解密的

我正在尝试使用openssl_encrypt,但我找不到一种方法使最终代码“简短”

$longCode = openssl_encrypt($number, $method, ENC_KEY, true, $iv);
$shortCode = .....
一些想法?

试试这个:

// generate random ID
    function generateRandomID ($len) {
        //To Pull Unique Random Values Out Of AlphaNumeric
        //removed number 0, capital o, number 1 and small L
        //Total: keys = 32, elements = 33
        $characters = array(
        "A","B","C","D","E","F","G","H","J","K","L","M",
        "N","P","Q","R","S","T","U","V","W","X","Y","Z",
        "1","2","3","4","5","6","7","8","9");

        //make an "empty container" or array for our keys
        $keys = array();

        //first count of $keys is empty so "1", remaining count is 1-6 = total 7 times
        while(count($keys) < $len) {
                //"0" because we use this to FIND ARRAY KEYS which has a 0 value
                //"-1" because were only concerned of number of keys which is 32 not 33
                //count($characters) = 33
                $x = mt_rand(0, count($characters)-1);
                if(!in_array($x, $keys)) {
                     $keys[] = $x;
                }
        }

        foreach($keys as $key){
             $random_chars .= $characters[$key];
        }
        return $random_chars;
    }
//生成随机ID
函数生成器域($len){
//从字母数字中提取唯一的随机值
//删除数字0、大写字母o、数字1和小L
//总计:键数=32,元素数=33
$characters=数组(
“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“J”、“K”、“L”、“M”,
“N”、“P”、“Q”、“R”、“S”、“T”、“U”、“V”、“W”、“X”、“Y”、“Z”,
"1","2","3","4","5","6","7","8","9");
//为我们的密钥制作一个“空容器”或数组
$keys=array();
//$keys的第一个计数为空,因此为“1”,剩余计数为1-6=总共7次
同时(计数($keys)<$len){
//“0”,因为我们使用它来查找具有0值的数组键
//“-1”,因为我们只关心32而不是33的键数
//计数($characters)=33
$x=mt_rand(0,计数($characters)-1);
if(!in_数组($x,$keys)){
$keys[]=$x;
}
}
foreach($key作为$key){
$random_chars.=$characters[$key];
}
返回$random_chars;
}

编辑:删除一些字母和数字以便于用户阅读,请参见代码中的注释。

第一步是使用块大小为8字节的密码方法,例如“rc2 cbc”

第二步是将结果字符串转换到字母表中;因为您的字母表大小只有36,所以最接近且“简单”的转换是base32;这将给出(去掉可选填充后)正好13个字符的字符串

理论上,您可以将4个字节转换为6个base36字符:

log(36) / log(2) ~ 5.17 bits, saves 1 bit after 6 blocks

6 x 5.17 ~ 31.02, 6 blocks fits inside 32 bits (unsigned long)

32 bits = 4 bytes -> 6 characters
错误实施

下面的代码应该可以做到这一点,但并不总是有效

解码过程如下:

$code2 = '';
foreach (str_split($final, 6) as $part) {
        $code2 .= pack('L', base_convert(strtolower($part), 36, 10));
}

不知何故,整数精度无法处理它,或者我正在做一些愚蠢的事情;无论哪种方式,它都不总是起作用。

当你有密码时,它怎么会接近可解密?据我所知,用户需要一个生成50000个随机码的函数,你的意思是什么?他正在生成基于整数和秘密密码的码。你不认为他想用这个秘密密码解密密码吗?比如在共享密钥加密协议中?他没有提到“随机”这个词。没错,但这不是“秘密密码”的继承函数吗?当你谈到“密码”时,我想你希望能够再次解密,对吗?你不是在找加密散列函数吗?这可能在security.stackexchange中更合适。首先,我想建议使用,但鉴于您的明文(从1到50k的数字)非常有限(并且是有序的),它会变成弱的caeser密码。。你能提出更多的要求吗?Joost是对的,我想能够解密代码。13个字符。。。接近解决方案。。。我必须保持12个字符的长度。@wildnove设法将其调整为12个字符:)你能告诉我如何将代码解密回数字吗?@wildnove我仍在一张纸上证明其正确性:)@wildnove不幸的是,它有时有效,有时无效
$final = '';
foreach (str_split($code, 4) as $part) {
    $x = current(unpack('L', $part));
    $final .= strtoupper(base_convert($x, 10, 36));
}
$code2 = '';
foreach (str_split($final, 6) as $part) {
        $code2 .= pack('L', base_convert(strtolower($part), 36, 10));
}