29406


AESで暗号化された文字列を復号化すると下記エラーが発生します。

[code]

    ValueError: Input strings must be a multiple of 16 in length
    
[/code]

今回暗号化されている文字列は70文字なのですが、16の倍数を要求されており、上記解消する方法がわかりません。

環境  
Python 3.5.1

エラーが発生しているコード（共通鍵についてはダミーを使用）

[code]

    import os
    import hashlib
    import base64
    from Crypto.Cipher import AES
    
    secret_key = hashlib.sha256('ABCDEFGH'.encode('utf-8')).digest()
    
    encrypt_data =bytes(b'BfkH%2FBcWEdwESdJVf%2FKI5nC0exQMuzow2SO%2BRnRBIXKAntEEAGzTAbghzalj5nUg')
    
    missing_padding = len(encrypt_data) % 4
    if missing_padding != 0:
    　　　　encrypt_data += b'='* (4 - missing_padding)
    
    base64_decode = base64.b64decode(encrypt_data)
    
    iv = encrypt_data[:16]
    enc = encrypt_data[16:] 
        
    aes = AES.new(secret_key, AES.MODE_CBC,iv)
    decrypt_data = aes.decrypt(enc)
    
[/code]


CC BY-SA 4.0
2016-10-07T02:35:50.520
29402
2022-01-30T16:47:01.243
2022-01-30T16:47:01.243
3060
18820
question
python pycrypto
PythonでのAES復号化でエラー”Input strings must be a multiple of 16 in length”


Base64エンコードされた結果は、数字(0～9)、英文字(a～z,A～Z)に、+と/を加えた６４種類の文字と、エンコード結果の文字数を４の倍数にするために最後に付加する=から成ります。

「今回暗号化されている文字列は７０文字」というのは、Base64エンコードされた結果の文字数は４の倍数というのに反します。  
また、int32_tさんが指摘しているように%が含まれる事はありません。

そこで、%で始まる部分はパーセントエンコーディング(URLエンコーディングとも呼ばれる）されているのではないかと推測しました。

パーセントエンコーディングで、"/"は%2F、"+"は%2Bに変換されますから、エンコード前の文字列に戻すと

'BfkH%2FBcWEdwESdJVf%2FKI5nC0exQMuzow2SO%2BRnRBIXKAntEEAGzTAbghzalj5nUg'  
は、  
'BfkH/BcWEdwESdJVf/KI5nC0exQMuzow2SO+RnRBIXKAntEEAGzTAbghzalj5nUg'  
となります。

２つの%2Fが"/"に、１つの%2Bが”＋”に書き換えられた結果、文字列の長さは６４となり、４の倍数になっています。

Base64エンコードされたデータとして以下の文字列を使ってみてください。  
'BfkH/BcWEdwESdJVf/KI5nC0exQMuzow2SO+RnRBIXKAntEEAGzTAbghzalj5nUg'  
コードの他の部分に誤りがなければ、うまく動くと思います。


CC BY-SA 3.0
2016-10-07T05:08:25.777
29406
2016-10-07T05:08:25.777
217
29402
answer