2017-03-07 23 views
0

有人遞給我這個代碼片斷作爲例子,我試圖讓它多了幾分「現代」:如何將mcrypt_decrypt轉換爲PHP中的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); 
} 

我在PHP7並試圖此使用OpenSSL轉換。我拿串,並通過現有的「urlsafe_b64decode」功能運行它,然後創造了另一個「解密」功能:

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

我認爲這將是一個相當簡單的1對1的轉換,但它總是返回「假」。任何想法我可能做錯了什麼? 在此先感謝!

編輯: 由於我使用的服務是一個.NET店,這裏是他們的.NET例如用於加密,如果有幫助的。

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 

更新2 所以我更新了我的本地服務器有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),向下滾動到企鵝。 取而代之的是將CBC模式與隨機IV一起使用,只是將加密數據與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 
);