我尝试用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
答案 0 :(得分:0)
您需要打开文件以便以二进制模式进行读写:
在Windows上,附加到该模式的
'b'
会以二进制模式打开文件,因此还有'rb'
,'wb'
和'r+b'
等模式。 Windows上的Python区分了文本和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍微改变。这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据。在读取和写入此类文件时要非常小心地使用二进制模式。在Unix上,将'b'
附加到该模式并没有什么坏处,因此您可以将它独立于平台用于所有二进制文件。
密文可能包含任何值的字节,包括不可打印的字符和行结尾。如果您将这些字节读取为文本,则可以省略这些字节转换为其他序列。