2017-03-13 26 views
1

私はAES-256とPythonをbase64で使ってタイムスタンプを暗号化しようとしています。出力のOpenSSLの換算は、このコマンドで生成されます。OpenSSLのようなAES-256を使ってPyCryptoで暗号化

openssl enc -aes256 -pass pass:'1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' -nosalt -base64 <<< "1489355323" 

私のPythonのコードはそうのようになります。

import time 
from base64 import b64encode 
from Crypto.Cipher import AES 

key = '1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' 
timestamp = "1489355323" 

BS = 16 
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
iv = "\x00" * 16 

aes = AES.new(key, AES.MODE_CBC, iv) 
ciphertext = aes.encrypt(pad(timestamp)) 

print b64encode(ciphertext) 

現在出力が異なっている、と私は、OpenSSLと同じ出力を取得する必要がありますコマンド。私が間違っていることは何か考えていますか?

+0

あなたは暗号何のライブラリを使用していますか? – glibdud

+0

pycrypt。インポートを含むようにコードを更新しました – Petru

+1

これはパスワードとキーの問題ですが、PyCryptoのドキュメントにはアクセスできないので、私はそれを再生できません。 '-pass'の代わりにopensslの' -K'と '-iv'オプションを使って試してみましょう。 – glibdud

答えて

3

OpenSSL encコマンドが使用するキーとivは、EVP_BytesToKey機能によってパスワードから派生したものです。コードを同じように動作させるには、その関数を再現する必要があります。

は、Pythonで、それは次のようになります。

from hashlib import md5 

# ... 

last = '' 
bytes = '' 

# 32 byte key (256 bits) + 16 byte IV = 48 bytes needed 
while len(bytes) < 48: 
    last = md5(last + password).digest() 
    bytes += last 

key = bytes[0:32] 
iv = bytes[32:48] 

# ... 

aes = AES.new(key, AES.MODE_CBC, iv) 
ciphertext = aes.encrypt(pad(timestamp)) 

このスキームは、本当にもう推奨されていませんが、encコマンドはまだそれを使用しています。私はOpenSSLが今後、より最新のキー導出機能を提供することを検討していると信じています。

また、改行で注意する必要があります。ここでは、文字列(<<<)文字列の末尾に改行を追加して、あなたは同じ結果を得るために暗号化されている文字列にそれを追加する必要があります。

timestamp = "1489355323\n" 
+1

+1また、 'openssl enc'に' -P'オプションを追加して、特定のコマンドのために派生したキーとIVを確認することができます。 – glibdud

関連する問題