skip to Main Content

I have a code like this:

$alphabet = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$alphabetSize = count($alphabet);
$alphabetBitSize = ceil(log($alphabetSize, 2));
$bitSize = $length * $alphabetBitSize;
$bytes = random_bytes(ceil($bitSize/8));

What I need is reading $bitSize bits in a loop to generate a latin1 string using the alphabet. Now I am totally lost about how to do this with the $bytes I have. Most of the answers are using string functions to do this, but I guess I need something binary. Another option is doing it with hex maybe. Any hints?

3

Answers


  1. Chosen as BEST ANSWER

    I wrote my own code with bin2hex

    function generateHexString($length){
        $bitSize = $length*4;
        $bytes = random_bytes(ceil($bitSize/8));
        $hex = bin2hex($bytes);
        return substr($hex, 0, $length);
    }
    
    function generateLatinString($length){
        $alphabet = array(
            '0','1','2','3','4','5','6','7','8','9',
            'a','b','c','d','e','f','g','h','i','j',
            'k','l','m','n','o','p','q','r','s','t',
            'u','v','w','x','y','z'
        );
        $alphabetSize = count($alphabet);
        $hexChunkSize = (int)(ceil(log($alphabetSize, 16)));
        $hexString = generateHexString($length*$hexChunkSize);
        $string = '';
        $hexChars = str_split($hexString);
        $characterIndex = 0;
        $chunkIndex = 0;
        foreach ($hexChars as $hexChar){
            $characterIndex += hexdec($hexChar) * pow(16, $chunkIndex);
            ++$chunkIndex;
            if ($chunkIndex === $hexChunkSize){
                while ($characterIndex >= $alphabetSize)
                    $characterIndex -= $alphabetSize;
                $character = $alphabet[$characterIndex];
                $string .= $character;
                $chunkIndex = 0;
            }
        }
        return $string;
    }
    

  2. I generally will use PHP’s built-in function unpack() to convert the bytes into a hexadecimal string and then to a binary string. I hope this helps.

    $alphabet = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
    $alphabetSize = count($alphabet);
    $alphabetBitSize = ceil(log($alphabetSize, 2));
    $bitSize = $length * $alphabetBitSize;
    $bytes = random_bytes(ceil($bitSize/8));
    
    $binaryStr = '';
    foreach (unpack('C*', $bytes) as $byte) {
        $binaryStr .= sprintf("%08b", $byte);
    }
    
    $resultString = '';
    for ($i = 0; $i < strlen($binaryStr); $i += $alphabetBitSize) {
        $bitSegment = substr($binaryStr, $i, $alphabetBitSize);
        $index = bindec($bitSegment) % $alphabetSize;
        $resultString .= $alphabet[$index];
    }
    
    echo $resultString;
    
    Login or Signup to reply.
  3. To generate a string from the random bytes in a loop, you can use bitwise operations to extract the necessary bits from the byte sequence. You can try the code bellow:

    $alphabet = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
        $alphabetSize = count($alphabet);
        $alphabetBitSize = ceil(log($alphabetSize, 2));
        
        $length = 10;  // Set your desired length
        $bitSize = $length * $alphabetBitSize;
        $bytes = random_bytes(ceil($bitSize/8));
        
        $result = '';
        $byteIndex = 0;
        $bitIndex = 0;
        
        for ($i = 0; $i < $bitSize; $i++) {
            $byte = ord($bytes[$byteIndex]);
            $bit = ($byte >> (7 - $bitIndex)) & 1;
            $result .= $alphabet[$bit];
            
            $bitIndex++;
            if ($bitIndex == 8) {
                $bitIndex = 0;
                $byteIndex++;
            }
        }
        
        echo $result;
    

    In this example, I used the ord function to get the ASCII value of a character from the random bytes. Then, performed bitwise shifting and masking to extract each bit. The resulting bit is used to index the alphabet array to form the final string.

    Let me know it this works for you..

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search