2016-05-04 87 views
0

Node.jsのpkcs7パディングを使用してメッセージを復号化しようとしています。このメッセージは暗号化され、Pythonコードから送信されました。私は純粋なPythonで動作するように管理しましたが、Node.jsにデコード(pkcs7パディング)機能を実装する方法を理解することはできません。誰も私がコードを再現するのを助けることができますか?またPKCS7Paddingを使用したPythonとNode.jsのAES暗号化

Pythonのエンコード、暗号化

import base64 
import hashlib 
from Crypto.Cipher import AES 
import pkcs7 

text = "data" 
pasword = "key"  

pw_bytes = pasword.encode('utf-8') 
text_bytes = text.encode('utf-8') 

m = hashlib.md5() 
m.update(pw_bytes) 
key = m.hexdigest() 
cipher = AES.new(key, AES.MODE_ECB) 
pad_text = pkcs7.encode(text_bytes) 
msg = cipher.encrypt(pad_text) 
EncodeMsg = base64.b64encode(msg) 
encryptedstring = EncodeMsg.decode("utf-8") 
print(encryptedstring) 

# Output: SxQE+SERkAzYcdG/ESAhiQ== 

、私は、Python pkcs7.py

import binascii 
try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 


def decode(bytestring, k=16): 
    val = binascii.hexlify(bytestring[-1]) 
    val = int(val, 16) 
    if val > k: 
     raise ValueError('Input is not padded or padding is corrupt') 
    l = len(bytestring) - val 
    return bytestring[:l] 


def encode(bytestring, k=16): 
    l = len(bytestring) 
    output = StringIO() 
    val = k - (l % k) 
    for _ in range(val): 
     output.write('%02x' % val) 
    return bytestring + binascii.unhexlify(output.getvalue()) 

Node.jsの復号化

const crypto = require('crypto'); 
var decipher = crypto.createDecipher('aes-128-ecb', 'key'); 
var decrypted = decipher.update('SxQE+SERkAzYcdG/ESAhiQ==', 'base64', 'utf8'); 
decrypted += decipher.final('utf8'); 

console.log(decrypted); 

にPKCS7パディングのためのカスタムコードを置きますこれはエラーです:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 
    at Error (native) 
    at Decipher.Cipher.final (crypto.js:153:26) 
    at Object.<anonymous> (/root/Documents/Testing-Repo/node.js/testing.js:21:23) 
    at Module._compile (module.js:413:34) 
    at Object.Module._extensions..js (module.js:422:10) 
    at Module.load (module.js:357:32) 
    at Function.Module._load (module.js:314:12) 
    at Timeout.Module.runMain [as _onTimeout] (module.js:447:10) 
    at tryOnTimeout (timers.js:224:11) 
    at Timer.listOnTimeout (timers.js:198:5) 
+1

あなたの実際のシステムがECBを使用するためではなく、展示用にECBを使用していると教えてください。 –

+0

はい、私はECB暗号= AES.new(鍵、AES.MODE_ECB)を使用することがわかります。 – xXxpRoGrAmmErxXx

+0

ECBモードはあまり安全ではありません。なぜか、ペンギンのイメージまでスクロールしてください。 – zaph

答えて

4

key = m.hexdigest()key = m.digest()に置き換えると、問題が解決するはずです。

+0

key = m.digest()をkey = m.digest()に置き換えると、私の問題は解決されているだけです。もう1つは削除できます。それは私が大好きです – xXxpRoGrAmmErxXx

+0

@xXxpRoGrAmmErxXxできるだけきれいに質問してください。 hexdigest()をdigest()に置き換えるだけで問題が解決するとは思いますが、質問に間違ったコードを付けると他の人に混乱を招く可能性があります。 – fbessho

+0

私は質問のコードを編集し、この答えからその部分を削除しました。 – fbessho

関連する問題