php
  • openssl
  • mcrypt
  • 2017-03-07 8 views 0 likes 
    0

    나는 예제로이 코드 조각을 물려 받았습니다, 나는 조금 더 "현대"만들려고 노력 해요 : 내가 PHP7에있어PHP에서 mcrypt_decrypt를 openssl_decrypt로 변환하는 방법은 무엇입니까?

    $key='09KzF2qMBy58ZWg137N$I4h6UwJvp!ij'; 
    $encrypted='Chttex_vuYYEK-oKQfwYrVCZYbnNh3tMgwGuK-VOsvt7TjF5M6MIcsE6e8DynZrHuxrmtmIpiN215WygdO-hzXnmx45RXzBWdxk_MkIvNoI='; 
    $encrypted = urlsafe_b64decode($encrypted); 
    $decrypted = decrypt($encrypted, $key); 
    $inflated = gzinflate($decrypted); 
    
    echo 'Decrypted: '.$inflated."<br />"; 
    
    function urlsafe_b64decode($data) { 
        return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT)); 
    } 
    
    function decrypt($data, $key) 
    { 
        return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB); 
    } 
    

    이 사용하려면 openssl을 변환하려고합니다. 나는 그것이 상당히 간단하게 1 : 1 변환 할 수 있지만 항상 "반환 것이라고 생각

    function decrypt($string, $key) 
    { 
        return openssl_decrypt($string, 'AES-256-ECB', $key); 
    } 
    

    : 나는 문자열을 기존 'urlsafe_b64decode'기능을 통해 그것을 실행 후 다른 '해독'기능을 생성 그릇된". 내가 뭘 잘못했을지 모르겠다. 미리 감사드립니다.

    편집 : 내가 사용하는 서비스는 .NET 상점이므로 암호화에 대한 .NET의 예가 여기에 있습니다. 2

    Public Shared Function Encrypt(ByVal data As Byte()) As Byte() 
         Dim encrypted As Byte() 
    
         Using rijAlg = New System.Security.Cryptography.AesManaged() 
          rijAlg.Key = Encoding.ASCII.GetBytes("encryptionkeyhere") 
          rijAlg.Padding = System.Security.Cryptography.PaddingMode.None 
          rijAlg.Mode = System.Security.Cryptography.CipherMode.ECB 
          Dim encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV) 
    
          Using msEncrypt = New MemoryStream() 
           Using csEncrypt = New System.Security.Cryptography.CryptoStream(msEncrypt, encryptor, System.Security.Cryptography.CryptoStreamMode.Write) 
            csEncrypt.Write(data, 0, data.Length) 
           End Using 
    
           encrypted = msEncrypt.ToArray() 
          End Using 
         End Using 
    
         Return encrypted 
    End Function 
    

    업데이트는 그래서 Mcrypt 라이브러리를 내 로컬 서버를 업데이트하고, 내 초기 코드에서 암호화 된 문자열을 디코딩 할 수 있었다. 이 원하는 응답이다 : "세션 id = 7bf727043d85e6963e640fb541d886a7454f8091 & RequestID가 = 1488925528"

    googleing 및-보내고 유래 및 실험 후, 나는 아직도하려면 openssl을 사용하여 제대로 문자열의 암호를 해독 할 수 없습니다입니다. 심지어 가능할까요?

    +0

    왜 단순히 Mcrypt로 문자열을 디코딩하고 OpenSSL로 다시 암호화하지 않습니까? –

    +0

    아쉽게도 PHP7 서버이며 mcrypt 확장 프로그램을 설치하거나 ini 파일을 변경할 권한이 없습니다. – TerryMatula

    +0

    ECB 모드를 사용하지 마십시오. 안전하지 않습니다. [ECB 모드] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)를 참조하고 펭귄까지 스크롤하십시오. 대신 무작위 IV가있는 CBC 모드를 사용하고 암호화 된 데이터 앞에 IV를 사용하여 암호 해독에 사용하면 비밀로 할 필요가 없습니다. – zaph

    답변

    0

    이것은 답변이 아니지만 코드 묶음이 포함되어 있으므로 여기에 넣겠습니다. 그것은 또한 다른 사이트에서 해제되었지만 우연히 테스트하고 적절한 신용을 부여 할 수없는 동안 창을 닫았습니다.

    또한 다른 암호화 방법 (ECB)을 사용합니다. 그러나 m aybe 그것은 당신을위한 출발점입니다. 보시다시피이 코드를 실행하면 오류가 발생하지만 맨 아래의 Vardump에서는 실제로 암호화 된 텍스트 문자열을 반환합니다.

    희망은 당신을 돕는다! 문 밖으로 나야 해!

    <?php 
    
    $key = "1234541413411111"; 
    $data = "hello world"; 
    
    $cipher = mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128, 
        $key, 
        $data, 
        MCRYPT_MODE_ECB); 
    
    $plain = openssl_decrypt(
        $cipher, 
        'aes-128-ecb', 
        $key, 
        OPENSSL_RAW_DATA | OPENSSL_NO_PADDING 
    ); 
    
    //try to detect null padding 
    if (mb_strlen($iv, '8bit') % mb_strlen($plain, '8bit') == 0) { 
        preg_match_all('#([\0]+)$#', $plain, $matches); 
        if (mb_strlen($matches[1][0], '8bit') > 1) { 
         $plain = rtrim($plain, "\0"); 
         trigger_error('Detected and stripped null padding. Please double-check results!'); 
        } 
    } 
    
    var_dump(
        $message, 
        bin2hex($cipher), 
        $plain, 
        mb_strlen($message, '8bit'), 
        mb_strlen($plain, '8bit'), 
        $message === $plain 
    ); 
    

     관련 문제

    • 관련 문제 없음^_^