2016-09-26 2 views
0

인쇄 나는 '내가 일반 텍스트 파일이어야 할'말 해독 텍스트 파일에 문제가있어.파이썬 AES 암호 해독은 암호화 된 텍스트

암호화가 잘 작동하지만 암호를 해독하면 혼합 텍스트, 일반 텍스트가 암호화됩니다.

지금은 글쓰기가 아마추어적임을 알고 있습니다.하지만 도움을 청해야합니다. def 함수로 빌드하려고했지만 잘되지 않았다.

암호화의 패딩이 문제라고 생각하지만 16 바이트 텍스트 파일에서 테스트하면 혼합. 테스트 에 대한

#!/usr/bin/env python 

from Crypto.Cipher import AES 
from Crypto.Protocol.KDF import PBKDF2 
from Crypto import Random 
import os 

file_path = raw_input("Enter File path: ") 
if os.path.isdir(file_path): #check if the path exists 
    print "\nFile path founded, continue..\n" 
else: 
    print "\nFile path is not correct\nExiting.\n" 
    exit(0) 
file_name = raw_input("Enter File name: ") 
full_path = file_path + file_name 
if os.path.isfile(full_path): 
    print "\nFile name founded, continue..\n" 
else: 
    print "\nFile name is not correct\nExiting.\n" 
    exit(0) 



print "Now encrypt" 
key_size = 32 #AES256 
iterations = 10000 
key = os.urandom(32) 
read = open(full_path,'r+') 
line = read.readline() 
secret = line 
length = 16 - (len(secret) % 16) #PKCS7 adds bytes of the length of padding 
secret += chr(length) * length 
read.close() 
salt = Random.new().read(key_size) #salt the hash 
iv = Random.new().read(AES.block_size) 
derived_key = PBKDF2(key, salt, key_size, iterations) 
cipher = AES.new(derived_key, AES.MODE_CBC, iv) 

encodedtext = iv + cipher.encrypt(secret) 
read = open(full_path, 'w') 
read.write(encodedtext) 
read.close() 


print "Now decrypt" 
key_size2 = 32 #AES256 
iterations2 = 10000 
read2 = open(full_path,'r') 
line2 = read2.readline() 
secret2 = line2 
length2 = 16 - (len(secret2) % 16) #PKCS7 adds bytes of the length of padding 
secret2 += chr(length2) * length2 
read2.close() 
dencodedtext2 = iv + cipher.decrypt(secret2) 
read2 = open(full_path, 'w') 
read2.write(dencodedtext2) 
read2.close() 
print "that worked?" 

내가 경로 준 '/ 홈/****/Dekstop/ 을하고 난 파일을 준'난 '일반 텍스트 파일이어야 할'텍스트와 함께 'TEST.TXT을 및 내가이있어,

悑 晍  㱣 ໸ 弧 殲 턕컫 聅 ㇛ 좎 䀋 傖 粁 내가 일반 텍스트되고 싶어 fileԊԅԅ ᡶ 䴈 ᚖ↺ 髱 준 ქ ꂛ

왜 내가 인쇄 할 때 secret2 'dencodedtext2 = iv + cipher.decrypt (secret2)'이후에 ext가 암호화와 혼합 되었습니까? 어떻게 해결할 수 있습니까? 무엇이 그렇게 끔찍한 일을하고 있습니까?

모든 종류의 도움에 감사드립니다. 코드 내에서 두 가지 주요 실수 있습니다

답변

1

다음 IV가 필요

  • 전에 벗겨 (그리고시 사용) 대신에 일반 텍스트로 다시 추가 암호 해독을 할 수는; 현재 평문은 IV로 시작하고 해독 된 IV로 시작합니다.
  • 패딩은 암호 해독이되지 전에, 현재 일부 패딩 관련 추문이 여전히 끝에 표시 한 후 제거해야합니다.
+0

** 해독을하기 전에 IV **를 제거하는 방법은 무엇입니까? 만큼 내가 암호 해독 전에 패딩을 제거 볼 수 있습니다. 예를 들면? – elad

+0

는 당신이 제공 한 코드는 별도의 문제 때문에 방법에서 * 문제의 분해 *, 즉 분할 관련 기능에 많은 노력을 표시하지 않습니다 특히 이후 나는 그 노력을하려는 모르겠어요. 게다가, 우리는 배열을 분할하고 배열의 오른쪽에서 바이트를 제거하는 것에 대해 말합니다. 그건 로켓 과학이 아니지, 그렇지? 주위에 많은 예제가 있어야합니다. –

+0

도움과 빠른 답변에 감사드립니다. – elad

관련 문제