> 16) & 0xffff; $lowa = $a & 0xffff; $highb = ($b >> 16) & 0xffff; $lowb = $b & 0xffff; $highsum = $higha + $highb; $lowsum = $lowa + $lowb; # overflow low-addition add high-addition $highsum += ($lowsum & 0x00010000) >> 16; $highsum &= 0xffff; $lowsum &= 0xffff; return ($highsum << 16) | $lowsum; } private function bf_enc($ll, $r, $n) { $ll ^= $this->pk[$n]; $b1 = $this->sk[($r >> 24) & 0xff]; $b2 = $this->sk[256 + (($r >> 16) & 0xff)]; $b3 = $this->sk[512 + (($r >> 8) & 0xff)]; $b4 = $this->sk[768 + ($r & 0xff)]; return $ll ^ $this->sec_add(($this->sec_add($b1, $b2) ^ $b3), $b4); } private function bf_encrypt($l, $r) { $l ^= $this->pk[0]; for ($i = 1; $i < 17; $i += 2) { $r = $this->bf_enc($r, $l, $i); $l = $this->bf_enc($l, $r, $i + 1); } $r ^= $this->pk[17]; return array($r, $l); } private function bf_decrypt($l, $r) { $l ^= $this->pk[17]; for ($i = 16; $i > 0; $i -= 2) { $r = $this->bf_enc($r, $l, $i); $l = $this->bf_enc($l, $r, $i - 1); } $r ^= $this->pk[0]; return array($r, $l); } private function asc2int($asc) { return (ord($asc[0]) << 24) | (ord($asc[1]) << 16) | (ord($asc[2]) << 8) | (ord($asc[3])); } private function int2asc($int) { return chr($int >> 24) . chr(($int >> 16) & 0xff) . chr(($int >> 8) & 0xff) . chr($int & 0xff); } private function bf_set_key($key) { if (strlen($key) <= 0) $key = ' '; while (strlen($key) < 72) $key .= $key; $key = substr($key, 0, 72); $this->pk = $this->p; $this->sk = $this->s; $l = 0; $r = 0; for ($i = 0; $i < 18; $i ++) $this->pk[$i] ^= $this->asc2int(substr( $key, $i * 4, 4)); for ($i = 0; $i < 18; $i += 2) { list($l, $r) = $this->bf_encrypt($l, $r); $this->pk[$i ] = $l; $this->pk[$i + 1] = $r; } for ($i = 0; $i < 1024; $i += 2) { list($l, $r) = $this->bf_encrypt($l, $r); $this->sk[$i ] = $l; $this->sk[$i + 1] = $r; } } private function expand($text) { while (strlen($text) % 8 != 0){ $text .= 'x'; } return $text; } private function encrypt($text) { $len = strlen($text); $plain = ''; for ($i = 0; $i < $len; $i += 8) { $l = $this->asc2int(substr($text, $i, 4)); $r = $this->asc2int(substr($text, $i + 4, 4)); list($l, $r) = $this->bf_encrypt($l, $r); $plain .= $this->int2asc($l) . $this->int2asc($r); } return $plain; } private function decrypt($text) { $len = strlen($text); $plain = ''; for ($i = 0; $i < $len; $i += 8) { $a = $this->asc2int(substr($text, $i, 4)); $b = $this->asc2int(substr($text, $i + 4, 4)); list($a, $b) = $this->bf_decrypt($a, $b); $plain .= $this->int2asc($a) . $this->int2asc($b); } return $plain; } public function ctEncrypt( $plaintext, $password ) { if( mb_check_encoding($plaintext,'UTF-8' )===true){ //echo 'Convert String'; $plaintext = utf8_decode($plaintext); } if( mb_check_encoding($password,'UTF-8' ) === true){ //echo 'Convert Passwort'; $password = utf8_decode( $password ); } if ( strlen($password) <= 0 ){ echo 'Kein Passwort angegeben ABBRUCH'; return false; } $len = strlen( $plaintext ); $plaintext = $this->expand($plaintext); $this->bf_set_key($password); return array('data' => bin2hex($this->encrypt($plaintext)),'len'=>$len); } public function ctDecrypt( $cipher, $len, $password, $utf8=true ) { if (strlen($password) <= 0){ echo 'Kein Pass'; return false; } if( mb_check_encoding($password,'UTF-8' ) === true){ //echo 'Convert Passwort'; $password = utf8_decode( $password ); } # converts hex to bin $cipher = pack('H' . strlen($cipher), $cipher); if ($len > strlen($cipher)) { // echo 'Length mismatch. The parameter len is too large.'; return false; } $this->bf_set_key($password); $string = substr($this->decrypt($cipher), 0, $len); if($utf8 === true){ return utf8_encode( $string); } else { return $string; } } } ?>