2012-09-24 5 views
10

ile AES şifre çözme dolgulama Python'da AES CBC şifre çözme işlemini uygulamaya çalışıyorum. Şifrelenmiş metin 16bayttan fazla olmadığı için, doldurma gerekliydi. ": Tek uzunlukta dize TypeError"PKCS5 Python

Ama PyCrypto Python PKCS5 uygulanması için uygun bir referans bulamadık dolgu olmadan, bu hata

yüzüne çıktı. Bunu uygulamak için herhangi bir komut var mı? Teşekkürler

Marcus'un önerisine baktıktan sonra bunu yaptım.

Amacım aslında bu kodu kullanarak bir hex iletisinin (128 byte) şifresini çözmektir. Ancak, çıktı çok küçük olan "?:" Ve unpad komutu bu baytları siliyor. Bu kod.

from Crypto.Cipher import AES 
BS = 16 
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
unpad = lambda s : s[0:-ord(s[-1])] 

class AESCipher: 
    def __init__(self, key): 
    self.key = key 

    def encrypt(self, raw): 
     raw = pad(raw) 
     iv = raw[:16] 
     raw=raw[16:] 
     #iv = Random.new().read(AES.block_size) 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return (iv + cipher.encrypt(raw)).encode("hex") 

    def decrypt(self, enc): 
     iv = enc[:16] 
     enc= enc[16:] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return unpad(cipher.decrypt(enc)) 

mode = AES.MODE_CBC 
key = "140b41b22a29beb4061bda66b6747e14" 
ciphertext = "4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81"; 
key=key[:32] 
decryptor = AESCipher(key) 
decryptor.__init__(key) 
plaintext = decryptor.decrypt(ciphertext) 
print plaintext 
+1

http://stackoverflow.com/questions/12524994/encrypt-decrypt-using-pycrypto-aes-256/12525165#12525165, yanıtında dolgu fonksiyonları :) – Marcus

cevap

18

Şifre çözmeden önce hex kodlanmış değerini çözmeniz gerekir. Onaltılık kodlanmış anahtarlarla çalışmak isterseniz, onu da çözün ..

İşte, bu işe yaramalı.

from Crypto.Cipher import AES 
from Crypto import Random 

BS = 16 
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
unpad = lambda s : s[0:-ord(s[-1])] 

class AESCipher: 
    def __init__(self, key): 
     """ 
     Requires hex encoded param as a key 
     """ 
     self.key = key.decode("hex") 

    def encrypt(self, raw): 
     """ 
     Returns hex encoded encrypted value! 
     """ 
     raw = pad(raw) 
     iv = Random.new().read(AES.block_size); 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return (iv + cipher.encrypt(raw)).encode("hex") 

    def decrypt(self, enc): 
     """ 
     Requires hex encoded param to decrypt 
     """ 
     enc = enc.decode("hex") 
     iv = enc[:16] 
     enc= enc[16:] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return unpad(cipher.decrypt(enc)) 

if __name__== "__main__": 
    key = "140b41b22a29beb4061bda66b6747e14" 
    ciphertext = "4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81" 
    key=key[:32] 
    decryptor = AESCipher(key) 
    plaintext = decryptor.decrypt(ciphertext) 
    print "%s" % plaintext 
+0

yardımcı olabilir Bu **; ** ciphertext = ... 'nin sonunda muhtemelen orada olmamalı ... – kravietz