PyCrypto:要解密的文本必须是16字节长的倍数

时间:2015-09-06 10:41:25

标签: windows python-2.7 cryptography pycrypto

我尝试用PyCrypto做一个加密程序...它有效但有时我解密时我给出的错误是要解密的文本必须是16字节长的倍数。

不要看"打印"因为语言是意大利语。

from Crypto.Cipher import AES
from Crypto.Hash import SHA256
import time
print "++++++++++++++++++++++++++++++++++++++++++++++++++"
print "+          PROGRAMMA DI CRITTOGRAFIA             +"
print "+                versione 1.0                    +"
print "++++++++++++++++++++++++++++++++++++++++++++++++++"
def crypt(percorso):
    while 1:
        try:
            print "----------------------------------------------------------"
            print "inserisci la password di encriptazione"
            pasw=raw_input("oppure inserisci undo per tornare al menu principale  ")
            passw=SHA256.new(pasw).hexdigest()
            if len(passw) >= 32 :
                passw=passw[:32]
                f = open(percorso,"r")
                text=f.read()
                f.close
                while len(text)%16 != 0 :
                    text=text+("{")
                iv=passw[:16]
                enk=AES.new(passw,AES.MODE_CBC,iv).encrypt(text)
                f=open(percorso, "w")
                f.write(enk)
                f.close()
                print "Criptazione del file", percorso, "è avvenuta con Successo!"
                time.sleep(3)
                break
            else:
                print "la password inserita non è valida!!!"
                print "prova con una password più lunga..."
                time.sleep(2)
                break
        except :
            print "è avvenuto un errore durante la fase di criptazione."
            print "controllare il File", percorso,"e riprovare"
            time.sleep(2)
            break
def decrypt(percorso):
    while 1:
        try:
            print "----------------------------------------------------------"
            print "inserisci la password di decriptazione"
            pasw=raw_input("oppure inserisci undo per tornare al menu principale  ")
            passw=SHA256.new(pasw).hexdigest()
            if len(passw) >= 32 :
                passw=passw[:32]
                f = open(percorso,"r")
                text=f.read()
                f.close
                print text
                iv=passw[:16]
                dek=AES.new(passw,AES.MODE_CBC,iv).decrypt(text)
                Dek=dek.replace("{","")
                f=open(percorso, "w")
                f.write(Dek)
                f.close()
                print "Deriptazione del file", percorso, "è avvenuta con Successo!"
                time.sleep(3)
                break
            else:
                print "la password inserita non è valida!!!"
                print "prova con una password più lunga..."
                time.sleep(2)
                break
        except :
            print "è avvenuto un errore durante la fase di decriptazione."
            print "controllare il File", percorso,"e riprovare"
            time.sleep(2)
            break
ex= True
while ex == True :
    time.sleep(2)
    print "----------------------------------------------------------"
    prc=raw_input("immettere il percorso del file da criptare  ")
    print "----------------------------------------------------------"
    try:
        f=open(prc,"r")
        f.close()
        while 1:
            command=raw_input("immetti il comando ")
            if command == "help" :
                print "############################"
                print "I comandi sono:"
                print "############################"
                print "    help --> apre la lista dei comandi"
                print "    exit --> chiude il programma"
                print "    undo --> anulla il percorso del file selezionato"
                print "    crypt --> cripta il file selezionato"
                print "    decrypt --> decripta il file selezionato"
            elif command == "undo":
                break
            elif command == "exit":
                ex = False
                break
            elif command == "crypt":
                    crypt(prc)
            elif command == "decrypt":
                    decrypt(prc)
            else:
                print "----------------------------------------------------------"
                print "il comando inserito non è valido, scrivi help per consultare la lista dei comandi"
                time.sleep(2)
    except :
        print "----------------------------------------------------------"
        print "il percorso inserito non è valido"

我认为这个问题只出现在解密函数中:

def decrypt(percorso):
    while 1:
        try:
            print "----------------------------------------------------------"
            print "inserisci la password di decriptazione"
            pasw=raw_input("oppure inserisci undo per tornare al menu principale  ")
            passw=SHA256.new(pasw).hexdigest()
            if len(passw) >= 32 :
                passw=passw[:32]
                f = open(percorso,"r")
                text=f.read()
                f.close
                print text
                iv=passw[:16]
                dek=AES.new(passw,AES.MODE_CBC,iv).decrypt(text)
                Dek=dek.replace("{","")
                f=open(percorso, "w")
                f.write(Dek)
                f.close()
                print "Deriptazione del file", percorso, "è avvenuta con Successo!"
                time.sleep(3)
                break
            else:
                print "la password inserita non è valida!!!"
                print "prova con una password più lunga..."
                time.sleep(2)
                break
        except :
            print "è avvenuto un errore durante la fase di decriptazione."
            print "controllare il File", percorso,"e riprovare"
            time.sleep(2)
            break

1 个答案:

答案 0 :(得分:0)

您需要打开文件以便以二进制模式进行读写:

  

在Windows上,附加到该模式的'b'会以二进制模式打开文件,因此还有'rb''wb''r+b'等模式。 Windows上的Python区分了文本和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍微改变。这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据。在读取和写入此类文件时要非常小心地使用二进制模式。在Unix上,将'b'附加到该模式并没有什么坏处,因此您可以将它独立于平台用于所有二进制文件。

密文可能包含任何值的字节,包括不可打印的字符和行结尾。如果您将这些字节读取为文本,则可以省略这些字节转换为其他序列。