2017-11-27 34 views
0

연장 코드 mcrypt을 사용하여 작성한 코드가 있는데이 코드를 phpseclib으로 변경해야합니다. 하지만 내 코드는 Mcrypt 라이브러리 함수와 같은 출력을 생성하지 않습니다PhpSecLib의 mcrypt_encrypt와 동일한 코드

오래된 코드 :

$encryptedText =mcrypt_encrypt(
     MCRYPT_RIJNDAEL_256, 
     $myKey, 
     $data , 
     MCRYPT_MODE_CBC, 
     $myIV 
    ); 

내 새로운 코드 :

$aes = new \phpseclib\Crypt\AES(\phpseclib\Crypt\AES::MODE_CBC); 
$aes->setKey($myKey); 
$aes->setIV($myIV); 
$aes->disablePadding(); 
$seclib = $aes->encrypt($data); 

하지만 $encryptedText$seclib가 동일하지 않습니다.

+0

다른 lib로 결과를 해독 할 수 있습니까? –

+0

잘 모르겠지만 (보안을 위해) 동일한 텍스트를 두 번 암호화하도록 허용하지 않는 기본 동작이 아닙니다. –

+0

@RafailAkhmetshin 아니요, 다른 라이브러리로 해독하지 않습니다. 이 알고리즘으로 데이터를 암호화해야하는 서비스가 있습니다. – undone

답변

1

당신은 Rijndael을 일반적인 오해 인 AES와 동일시합니다.

AES은 그것의 서브 세트 - Rijndael을 128 만 키 크기 인 AES 변형 간의 차이 :

  • AES-128

    는 128 비트 키 Rijndael을-128이다.
  • AES-256은 다시 Rijndael-128이지만 256 비트 키를 사용합니다. 당신은 256 비트 블록 크기를 필요로하는 물론 당신은 AES를 수행하여 Rijndael을-256을 얻을 수 있도록

반면에 Rijndael을 변화의 접미사 수는 모두 키 크기 블록 크기에 의미 .

phpseclib docs에는 기본 변수 (암호, 모드, 키 크기, 비트 크기)를 입력 한 후 샘플 코드가 생성되는 페이지가 있습니다.

<?php 
include('Crypt/Rijndael.php'); 
include('Crypt/Random.php'); 

$cipher = new Crypt_Rijndael(); // could use CRYPT_RIJNDAEL_MODE_CBC 
$cipher->setBlockLength(256); 
// keys are null-padded to the closest valid size 
// longer than the longest key and it's truncated 
//$cipher->setKeyLength(256); 
$cipher->setKey('abcdefghijklmnopqrstuvwxyz123456'); 
// the IV defaults to all-NULLs if not explicitly defined 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 

$size = 10 * 1024; 
$plaintext = str_repeat('a', $size); 

echo $cipher->decrypt($cipher->encrypt($plaintext)); 

내가 라이브러리가 실제로 Mcrypt 라이브러리의 가용성 기능이없는 시스템이 암호를 지원하는 경우 잘 모르겠지만, 그것은해야한다 : 그것은 Rijndael, CBC, 256, 256에 대해 다음 출력합니다.


mcrypt가 PHP에서 삭제되기 때문에이 작업을 수행한다고 가정합니다. 전략을 변경하는 것이 좋습니다.

위의 코드가 작동하더라도 phpeclib 문서에 언급 된 사용자 정의 PHP 구현을 사용할 때 속도가 매우 느릴 수 있지만 더 중요하게 -이 라이브러리가 중지되면 다른 대안은 없습니다. Rijndael의 비 AES 변형은 유비 쿼터스가 아니며 오늘날에는 더 많은 최신 알고리즘이 제공됩니다 (힌트 : libsodium이 PHP 7.2에 추가됨).

내가 너라면, 알고리즘을 완전히 바꿀 것입니다. 물론 이것은 모든 데이터를 다시 암호화하는 것을 의미 할 것입니다.하지만 결국은 그렇게해야 할 것입니다. 그리고 지금은 실제로 그렇게하는 것이 가장 좋은시기입니다.

+0

나는 그것을 제어해야하는 외부 서비스에서 사용할 데이터를 암호화하고 있습니다. 이 외에도 귀하의 솔루션은 매력처럼 작동했습니다. 감사. – undone

+0

당신을 진심으로 환영합니다. 그러나이 제 3 자 서비스를 통해 다른 옵션에 대해 알아봐야합니다. 문제는 똑같을 것입니다. – Narf

+0

@Narf - phpseclib는 OpenSSL을 사용할 수있는 경우이를 사용합니다.mcrypt를 사용할 수있을 때 자체적 인 내부 구현을 사용하기 전에 우선적으로이를 사용합니다. 자체 구현은 다른 옵션을 사용할 수없는 경우 최후의 수단으로 만 사용됩니다. – neubert