2013-05-17 3 views
-2

나는이 스레드에서 암호화 PHP 알고리즘을 만들려고 오전 :PHP DES 암호화 - 암호화 기능

how to sync encryption between delphi and php using dcpcrypt (shunty의 답변을 참조) 여기

는 내가 지금까지 무엇을 가지고 :

echo encrypt("this is a test", "test"); 
:
function encrypt($str, $key) 
{ 
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC); 

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114); 
    $iv = implode(array_map("chr", $ivbytes)); 

    $pad = ord($str[strlen($str) - 1]); 
    $enc = substr($str, 0, strlen($str) - $pad); 

    $enc = base64_encode($str); 
    $k = mhash(MHASH_SHA1, $key); 

    //return substr($dec, 0, strlen($dec) - $pad); 
    $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv); 

    return $dec; 
} 

는 내가 잘못하고 있지만 그것을 테스트하고있어 확실하지 않다 Z =«RCdrçb~hý'¯á · 오 가 제공해야 할 때 : 내가 잘못 가고 어디 WRaG/8xlxqqcTAJ5UAk4DA의 ==를

사람이 설명에 나를 도와 드릴까요, 정말 도움을 주셔서 감사합니다 것 (3210)

출력을 제공합니다 나는 갈 수있어.

편집 :

function encrypt_SO($str, $key) 
    { 
     $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC); 

     $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114); 
     $iv = implode(array_map("chr", $ivbytes)); 

     $pad = ord($str[strlen($str) - 1]); 
     $enc = substr($str, 0, strlen($str) - $pad); 
     $k = mhash(MHASH_SHA1, $key); 

     //return substr($dec, 0, strlen($dec) - $pad); 
     $dec = mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $enc, MCRYPT_MODE_CBC, $iv); 

     return base64_encode($dec); 
    } 

끝까지 인코딩을 옮겼다.

편집 2 : 모든 사람의 도움이 게시물 솔루션 덕분에 :

암호화 :

function encrypt_SO($str, $key) 
{ 
    $keysize = mcrypt_get_key_size(MCRYPT_DES, MCRYPT_MODE_CBC); 

    $ivbytes = array(72, 163, 99, 62, 219, 111, 163, 114); 
    $iv = implode(array_map("chr", $ivbytes)); 

    $k = mhash(MHASH_SHA1, $key); 

    $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); 
    $padsize = $blocksize - (strlen($str) % $blocksize); 
    $str .= str_repeat(chr($padsize), $padsize); 

    return base64_encode(mcrypt_encrypt(MCRYPT_DES, substr($k, 0, $keysize), $str, MCRYPT_MODE_CBC, $iv)); 
} 
+0

'WRaG/8xlxqqcTAJ5UAk4DA == '가베이스 64 인코딩 된 패딩을 제거'ž«RCdrçb~hý'¯á · 오. –

+0

아,하지만 이것을 사용했습니다 : $ enc = base64_encode ($ str); - 맞지 않아? 나는 패딩을 이해하려고 노력하고 있었지만 나는 어딘가에서 실수를 저질렀다고 생각한다. – user1928362

+0

당신이 거기에 내 의견의 추진력을 변경 말할 수 있습니다. –

답변

0

위의 의견에 응답하려면

  • 가져 오기 키 사이즈와가의 블록 크기
  • 받기 IV - 이것은 무작위 적으로 적절하게 생성되어야하지만 DCPcryp로 작업해야합니다. IV를 수동으로 지정하지 않고 제공된 것을 사용해야합니다.
  • 해시 키
  • 는 패딩 추가 -이 조금 잘못있어. 해야합니다 (위와 -

    • 가 키 사이즈
    • 는 IV를 가져 오기 :

      $blocksize = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); 
      $padsize = $blocksize - (strlen($str) % $blocksize); 
      $str .= str_repeat(chr($padsize), $padsize); 
      
    • 암호화

    • Base64로 인코딩

    해독 :이 예를 들어, 당신은 같은 뭔가가 필요 암호화하는 데 사용 된 것과 동일해야하지만 실제로 다시 사용해야합니다. 적절히 암호로 생성됨).

  • 해시 키
  • Base64로 디코딩
  • 복호화
+0

오, 세상에, 정말 고마워 !!! 이틀 동안 이걸 알아 내려고 노력했는데 마침내 당신 덕분에 일하게 됐어. OP를 편집 할 것입니다. 그러나 패딩 기술을 사용했고 암호화 방법이 MCRYPT_MODE_ECB가 MCRYPT_MODE_CBC가 아니라 다른 결과를 얻는 이유이기도하다는 것을 깨달았습니다. Delphi에서 DCPcrypt로 작업 중이므로 DCPcrypt에서 IV를 변경할 수있는 방법이 있습니까? 아니면 너무 복잡합니까? 나는 IV가 너무 잘 이해하지 못한다. – user1928362

+0

또 다른 행복한 고객 :-) 물론 더 좋은 방법이 있습니다. DCPcrypt2.pas에서 소스를 확인하고 TDCP_cipher.InitStr을 찾으면 키가 파생되는 방식을 볼 수 있습니다. 그러면 nil IV로 TDCP_cipher.Init을 호출합니다. 코드에서 수행해야하는 모든 작업은 .InitStr 대신 .Init를 호출하는 것입니다.하지만 IV를 생성하고받는 사람에게 IV를 전달하거나 전송하는 방법을 연구해야합니다. 나는 그것을 운동으로 남겨 둡니다! – shunty

+0

감사합니다. IV 생성에 대한 정보를 찾아서 오늘 나중에 다시 시작하겠습니다. 정말로 도움을 주시면 감사하겠습니다. :) – user1928362