0

以下は、pycryptoモジュールでpythonを使用してファイルを暗号化および復号化するために作成したコードです(まだ完全ではありません)。

from Crypto.Hash import SHA256 
from Crypto.Cipher import AES 
import getpass

class ED(object):   
  def getfromuser(self,choice):
    if choice=='key':
        key=getpass.getpass('Enter AES Key (minimum 16 characters): ')
        if len(key)<16:
            print 'Key entered too short. Please try again.'
            self.getfromuser(choice)
        key=key+str(8-len(key)%8)*(8-len(key)%8)
        return key
    if choice=='IV':
        IV_seed=raw_input('Enter a seed for the IV: ')
        IV=SHA256.new()
        IV.update(IV_seed)
        IV.digest()
        return str(IV)[0:16]

  def AESEncrypt(self,key,IV,source,dest):

    f=open(source,"r")
    fstream=f.read()
    f.close()

    AES_stream=AES.new(key,AES.MODE_CBC,IV)
    AES_encrypted=AES_stream.encrypt(fstream)

    with open(dest,"w") as write_file:
        write_file.write(AES_encrypted)

  def AESDecrypt(self,key,IV,source,dest):
    f=open(source,"r")
    fstream=f.read()
    f.close()
    AES_stream=AES.new(key,AES.MODE_CBC,IV)
    AES_decrypted=AES_stream.decrypt(fstream)
    with open(dest,"w") as write_file:
        write_file.write(AES_decrypted)

これを使用して JPG ファイルを暗号化しようとすると、次のエラーが発生しました。

    AES_encrypted=AES_stream.encrypt(fstream)
    ValueError: Input strings must be a multiple of 16 in length

mp4 ファイルで試してみたところ、うまくいきました。暗号化と復号化も同様です。

このエラーの原因と修正方法を教えてください。

4

1 に答える 1

3

解決策を見つけました。パディングの煩わしさを望まない場合は、次のようにCFB (Cipher feedback)モードを使用できます。

AES_stream=AES.new(key,AES.MODE_CFB,IV)

于 2012-07-09T19:37:26.230 に答える