2017-03-07 1 views
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のを持っている私のローカルサーバーを更新し、私の最初のコードスニペットから暗号化された文字列をデコードすることができました。私はまだ正確にOpenSSLを使用して文字列を復号化することができないんだ、googleingとstackoverflowの-INGのと実験した後、「セッションID = 7bf727043d85e6963e640fb541d886a7454f8091 & requestid = 1488925528」

:これは、所望の応答です。それも可能ですか?

+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 それはあなたのための出発点です。ご覧のとおり、このコードを実行するといくつかのエラーが発生しますが、一番下のコードでは暗号化されたテキスト文字列が返されます。

希望すると助かります!私はドアを使い果たしなければならない!

<?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 
); 
関連する問題