2

増分番号(1から50000)と秘密のパスワードから始まる50,000個のコードを作成する必要があります。私はphpでそれをしなければならず、最終的なコードは8文字または12文字の長さで、大文字(AZ)と数字(0-9)のみを含む必要があります。

最終的なコードは、パスワードで復号化できる必要があります...

openssl_encryptを試していますが、最終的なコードを「短く」する方法が見つかりません。

$longCode = openssl_encrypt($number, $method, ENC_KEY, true, $iv);
$shortCode = .....

いくつかのアイデア?

4

2 に答える 2

1

最初のステップは、ブロック サイズが 8 バイトの暗号方式を使用することです。たとえば、「rc2-cbc」などです。

$nr = 1234;
$key = 'secretkey';
$method = 'rc2-cbc';

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));

$code = openssl_encrypt($nr, $method, $key, true, $iv);

2 番目のステップは、結果の文字列をアルファベットにキャストすることです。アルファベットのサイズが 36 しかないため、最も近い「簡単な」変換は base32 です。これにより、(オプションのパディングを取り除いた後) 正確に 13 文字の文字列が得られます。

理論的には、4 バイトを base36 の 6 文字に変換できます。

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

不完全な実装

次のコードはそれを行うはずですが、(常に) 機能しません!

$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));
}

どういうわけか、整数精度がそれを処理できないか、何か愚かなことをしています。いずれにせよ、常に機能するとは限りません。

于 2012-10-18T08:48:56.647 に答える
0

これを試してください:

// 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;
    }

編集: 読みやすくするために一部の文字と数字を削除しました。コード内のコメントを参照してください。

于 2012-10-18T08:29:34.357 に答える