2011-10-09 2 views
3

Openfire는 복어 암호화를 사용하여 데이터베이스에 암호화 된 암호를 저장합니다.PHP를 통해 openfire MySQL에서 암호화 된 암호를 생성

http://svn.igniterealtime.org/svn/repos/openfire/trunk/src/java/org/jivesoftware/util/Blowfish.java은 openfire에서 암호화/암호 해독 기능이 작동하는 방법에 대한 Java 구현입니다.

제 목표는 PHP와 MySQLI를 통해 데이터베이스에 새로운 사용자 항목을 만드는 것입니다. 시도한 모든 유사 콘텐츠는 이미 데이터베이스에있는 것과 일치하지 않는 결과를 가져 왔습니다. 예 :

d3f499857b40ac45c41828ccaa5ee1f90b19ca4e0560d1e2dcf4a305f219a4a2342aa7364e9950db은 암호화 된 암호 중 하나입니다. mcrypt blowfish php slightly different results when compared to java and .net

$key = '1uY40SR771HkdDG'; 
$pass = 'stackoverflow'; 
$blocksize = mcrypt_get_block_size('blowfish', 'cbc'); // get block size 
$pkcs = $blocksize - (strlen($data) % $blocksize); // get pkcs5 pad length 
$data.= str_repeat(chr($pkcs), $pkcs); // append pkcs5 padding to the data 

// encrypt and encode 
$res = base64_encode(mcrypt_cbc(MCRYPT_BLOWFISH,$key, $pass, MCRYPT_ENCRYPT)); 
echo $res; 
// result: 3WXKASjk35sI1+XJ7htOGw== 

어떤 영리한 아이디어, 또는 눈부신 문제에 따라

echo mcrypt_cbc(MCRYPT_BLOWFISH, '1uY40SR771HkdDG', 'stackoverflow', MCRYPT_ENCRYPT, '12345678'); 
// result: áë*sY¶nŸÉX_33ô 

또 다른 : stackoverflow

나는 몇 가지 변화를 시도했습니다 일반 텍스트,이 있는가? 이 질문의 첫 번째 링크에서 참조한대로 Blowfish.encryptString()을 구현하기 만하면됩니다.

+1

가장 현저한 문제는 * 사용자가 * 해싱 * 대신 암호를 암호화하고 있다는 것입니다. ** 절대적으로 ** 암호가 원래 형식 인 경우를 제외하고는 그렇게하지 마십시오. – NullUserException

+1

XMPP 프로토콜은 일반 텍스트를 사용하여 사용자를 인증합니다. 그것이 Openfire에서 암호화/해독이 필요한 이유입니다. 그냥 내가 가지고있는 것과 함께 일하려고 노력하는 ... – sdolgy

+0

그것이 생산하는 것에 대한 몇 가지 테스트 벡터가 있습니까? 키, iv, 데이터 및 암호문 조합 – Ivo

답변

6

내가 만든 클래스는 암호화하고 해독합니다.

결과를 재현하려면/[pre/app]를 저장해야합니다.

자바 코드에 대한 일부 테스트 벡터가 좋을 것입니다.

<?php 

/** 
* Emulate OpenFire Blowfish Class 
*/ 
class OpenFireBlowfish 
{ 
    private $key; 
    private $cipher; 

    function __construct($pass) 
    { 
     $this->cipher = mcrypt_module_open('blowfish','','cbc',''); 
     $this->key = pack('H*',sha1($pass)); 
    } 

    function encryptString($plaintext, $iv = '') 
    { 
     if ($iv == '') { 
      $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->cipher)); 
     } 
     else { 
      $iv = pack("H*", $iv); 
     } 
     mcrypt_generic_init($this->cipher, $this->key, $iv); 
     $bs = mcrypt_enc_get_block_size($this->cipher); // get block size 
     $plaintext = mb_convert_encoding($plaintext,'UTF-16BE'); // set to 2 byte, network order 
     $pkcs = $bs - (strlen($plaintext) % $bs); // get pkcs5 pad length 
     $pkcs = str_repeat(chr($pkcs), $pkcs); // create padding string 
     $plaintext = $plaintext.$pkcs; // append pkcs5 padding to the data 
     $result = mcrypt_generic($this->cipher, $plaintext); 
     mcrypt_generic_deinit($this->cipher); 
     return $iv.$result; 
    } 

    function decryptString($ciphertext) 
    { 
     $bs = mcrypt_enc_get_block_size($this->cipher); // get block size 
     $iv_size = mcrypt_enc_get_iv_size($this->cipher); 
     if ((strlen($ciphertext) % $bs) != 0) { // check string is proper size 
      return false; 
     } 
     $iv = substr($ciphertext, 0, $iv_size); // retrieve IV 
     $ciphertext = substr($ciphertext, $iv_size); 
     mcrypt_generic_init($this->cipher, $this->key, $iv); 
     $result = mdecrypt_generic($this->cipher, $ciphertext); // decrypt 
     $padding = ord(substr($result,-1)); // retrieve padding 
     $result = substr($result,0,$padding * -1); // and remove it 
     mcrypt_generic_deinit($this->cipher); 
     return $result; 
    } 

    function __destruct() 
    { 
     mcrypt_module_close($this->cipher); 
    } 
} 

$enckey = "1uY40SR771HkdDG"; 
$enciv = 'd3f499857b40ac45'; 
$javastring = 'd3f499857b40ac45c41828ccaa5ee1f90b19ca4e0560d1e2dcf4a305f219a4a2342aa7364e9950db'; 

$a = new OpenFireBlowfish($enckey); 
$encstring = bin2hex($a->encryptString('stackoverflow',$enciv)); 
echo $encstring . "\n"; 
echo $a->decryptString(pack("H*", $encstring)) . "\n"; 

$b = new OpenFireBlowfish($enckey); 
echo $b->decryptString(pack("H*", $javastring)) . "\n"; 
+0

Ivo, 감사합니다. 그러나,'d3f499857b40ac45c41828ccaa5ee1f90b19ca4e0560d1e2dcf4a305f219a4a2342aa7364e9950db'는 나의 예제에서'stackoverflow'가 암호화되어 있고 이것은 여전히 ​​지정된 정보로 그것을 해독하지 않습니다. – sdolgy

+0

이 인코딩은 어떤 용도로 사용됩니까? 그것은 오랫동안 stackoverflow 할 때까지 보이는 – Ivo

+0

참고, 그것은 정확히 맞지 않으면 PHP가 데이터를 해독하지 못하는 것 ... 내가 잘못된 열쇠로 뭔가를 해독하기 위해 말하면, 그냥 거짓을 다시 보냅니다 : <확실하지 왜 지금이 순간입니다. – Ivo

1

Openfire의 코드는 전달 된 CBCIV 앞에 출력 문자열을 추가합니다. 또한 문자 세트로 유니 코드를 사용합니다. 이것들이 함께 문제 영역이 될 수 있습니다.

더 많은 도움을 주려는 복어의 내부 구조에 대해 충분히 알지 못합니다. 죄송합니다.

1

코드에 아무런 문제가 없지만 Openfire와 동일한 코드를 생성하려면 암호화 된 텍스트 앞에 두 개의 다른 항목을 추가해야합니다. 암호문의

  • 길이는
  • CBCIV (초기화 변수)

읽기 "공공 문자열 decryptString (문자열 sCipherText)는"자바 코드에서, 모든있다. 또한 PHP에서 CBCIV를 사용하는 방법에 대한 문서를 확인하십시오.

관련 문제