2017-07-14 7 views
1

これをPythonに変換するにはどうすればよいですか?私が混乱しているのは、ランダムなviです。mcrypt PHPをPythonに変換するには

PHP

public function fnEncrypt($sValue, $sSecretKey) 
    { 
    $sValue = $this->pkcs5_pad($sValue, mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'ecb')); 
     return rtrim(
      base64_encode(
       mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128, 
        $sSecretKey, $sValue, 
        MCRYPT_MODE_ECB, 
        mcrypt_create_iv(
         mcrypt_get_iv_size(
          MCRYPT_RIJNDAEL_128, 
          MCRYPT_MODE_ECB 
         ), 
         MCRYPT_RAND) 
        ) 
       ), "\0" 
      ); 
    } 

UPDATE:

これは正確にどのように働くかそれが必要!

パイソン

secret_key = 'he21jodkio1289ij' 
value = 'hello' 

BLOCK_SIZE = 16 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 
PADDING = '\0' 
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
cipher = AES.new(secret_key, AES.MODE_ECB) 
+0

mcryptを使用しないことをお勧めします。これはabandonwareであり、数年で更新されておらず、標準のPKCS#7(néePKCS#5)パディングもサポートされていません。バイナリデータ。 mcryptには、2003年にさかのぼる多くの傑出したバグ(https://sourceforge.net/p/mcrypt/bugs/)があります。PHP 7.2では廃止予定のmcrypt拡張機能は削除されます。代わりに[defuse](https://github.com/defuse/php-encryption)または[RNCryptor](https://github.com/RNCryptor)を使用することを検討してください。これらは完全な解決策を提供し、維持され、正しいものです。 – zaph

+0

まあ...もちろんそれは動作しません。あなたのPythonコードは完全に異なる暗号を使用しています! – duskwuff

+0

異なるモードと異なるパディング。 – zaph

答えて

1
  • PHPコードはDESを使用してAESでRIJNDAEL_128、Pythonコードを使用して、それらの両方が相互運用するために、同じ暗号化アルゴリズムを使用する必要があります。

    PHPコードはECBモードを使用していますが、PythonコードはCBCモードを使用していますが、どちらも同じモードを使用して相互運用する必要があります。

  • 標準でないPKCS#5パディングを使用していますが、使用しないでください。標準以外のヌルパディングが使用されます。相互運用するためには同じパディングを使用する必要があります。

注1:ECBモードはIVを使用しません。 IVがECBモードのために提供されるなら、それは無視されます。

注2:ECBモードを使用しないでください。安全ではありません。ECB modeを参照して、ペンギンまでスクロールしてください。その代わりに、乱数IVでCBCモードを使用し、復号化に使用するためにIVで暗号化されたデータの前に接頭辞を付けるだけで、秘密にする必要はありません。

関連する問題