Beispiel #1
0
 function mix($a, $b, $c)
 {
     $a -= $b;
     $a -= $c;
     $a ^= zeroFill($c, 13);
     $b -= $c;
     $b -= $a;
     $b ^= $a << 8;
     $c -= $a;
     $c -= $b;
     $c ^= zeroFill($b, 13);
     $a -= $b;
     $a -= $c;
     $a ^= zeroFill($c, 12);
     $b -= $c;
     $b -= $a;
     $b ^= $a << 16;
     $c -= $a;
     $c -= $b;
     $c ^= zeroFill($b, 5);
     $a -= $b;
     $a -= $c;
     $a ^= zeroFill($c, 3);
     $b -= $c;
     $b -= $a;
     $b ^= $a << 10;
     $c -= $a;
     $c -= $b;
     $c ^= zeroFill($b, 15);
     return array($a, $b, $c);
 }
function crunch($arg1, $arg2)
{
    $local4 = strlen($arg2);
    while ($local5 < $local4) {
        $local3 = ord(substr($arg2, $local5));
        $arg1 = $arg1 ^ $local3;
        $local3 = $local3 % 32;
        $arg1 = $arg1 << $local3 & 0xffffffff | zeroFill($arg1, 32 - $local3);
        $local5++;
    }
    return $arg1;
}
Beispiel #3
0
function rol($num, $cnt)
{
    return $num << $cnt | zeroFill($num, 32 - $cnt);
}
Beispiel #4
0
function AESDecryptCtr($ciphertext, $password, $nBits)
{
    if (!($nBits == 128 || $nBits == 192 || $nBits == 256)) {
        return '';
        // standard allows 128/192/256 bit keys
    }
    $nBytes = $nBits / 8;
    // no bytes in key
    setLength($pwBytes, $nBytes);
    for ($i = 0; $i < $nBytes; $i++) {
        $pwBytes[$i] = ord($password[$i]) & 0xff;
    }
    $pwKeySchedule = KeyExpansion($pwBytes);
    $key = Cipher($pwBytes, $pwKeySchedule);
    $key = array_merge($key, array_slice($key, 0, $nBytes - 16));
    // key is now 16/24/32 bytes long
    $keySchedule = KeyExpansion($key);
    $ciphertext = explode('-', $ciphertext);
    // split ciphertext into array of block-length strings
    // recover nonce from 1st element of ciphertext
    $blockSize = 16;
    // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
    setLength($counterBlock, $blockSize);
    $ctrTxt = unescCtrlChars($ciphertext[0]);
    for ($i = 0; $i < 8; $i++) {
        $counterBlock[$i] = ord($ctrTxt[$i]);
    }
    setLength($plaintext, count($ciphertext) - 1);
    for ($b = 1; $b < count($ciphertext); $b++) {
        // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
        for ($c = 0; $c < 4; $c++) {
            $counterBlock[15 - $c] = zeroFill($b - 1, $c * 8) & 0xff;
        }
        for ($c = 0; $c < 4; $c++) {
            $counterBlock[15 - $c - 4] = zeroFill($b / 0x100000000 - 1, $c * 8) & 0xff;
        }
        $cipherCntr = Cipher($counterBlock, $keySchedule);
        // encrypt counter block
        $ciphertext[$b] = unescCtrlChars($ciphertext[$b]);
        $pt = '';
        for ($i = 0; $i < strlen($ciphertext[$b]); $i++) {
            // -- xor plaintext with ciphered counter byte-by-byte --
            $ciphertextByte = ord($ciphertext[$b][$i]);
            $plaintextByte = $ciphertextByte ^ $cipherCntr[$i];
            $pt .= chr($plaintextByte);
        }
        // pt is now plaintext for this block
        $plaintext[$b - 1] = $pt;
        // b-1 'cos no initial nonce block in plaintext
    }
    return implode('', $plaintext);
}