2012-06-21 34 views
13

Tôi đang sử dụng Python 2.7. Tôi có một chuỗi chữ và số, mà trên đó tôi muốn thực hiện mã hóa/giải mã. Bất cứ điều gì tôi làm nên vẫn là 2 chiều và kết quả cũng phải là chữ và số.Python: Mã hóa chữ và số hai chiều

Ví dụ:

str = 'ma6546fbd' 
encrypted_data = encrypt_function(str) 
decrypted_data = decrypt_function(encrypted_data) 
print decrypted_data # I get 'ma6546fbd' 

Tôi đã làm gì thế này:

Tôi đã viết một hàm

def xor_crypt_string(data, key): 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(data, cycle(key))) 

này có các dữ liệu và một phím và trả về kết quả, các vấn đề là nó bao gồm các ký tự đặc biệt nữa, mà tôi muốn tránh.

+2

Bạn có lý do chính đáng để phát minh mã hóa của riêng mình không? –

+2

Anh ấy hầu như không _inventing_ nó, nó chỉ là một XOR – mhawke

+0

Tôi đã thử một số cơ chế như ASE, vv nhưng tôi nhận được ký tự đặc biệt trong những người quá. Như tôi đã nói tôi muốn có một chuỗi ký tự chữ và số sẽ được gửi tới người dùng dưới dạng json obj. Và đoạn mã trên là một thao tác XOR đơn giản –

Trả lời

33

Nếu bạn muốn mã hóa nghiêm trọng (đọc không thể phá vỡ) thì tôi sẽ sử dụng AES từ pycrypto một cái gì đó như thế này.

>>> from Crypto.Cipher import AES 
>>> from Crypto import Random 
>>> key = b'Sixteen byte key' 
>>> iv = Random.new().read(AES.block_size) 
>>> cipher = AES.new(key, AES.MODE_CFB, iv) 
>>> msg = iv + cipher.encrypt(b'Attack at dawn') 
>>> msg.encode("hex") 
'e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 

Đó là thông điệp ascii của bạn. Bây giờ giải mã thông báo như thế này

>>> recv='e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 
>>> cipher.decrypt(recv.decode("hex"))[len(iv):] 
'Attack at dawn' 
>>> 

Bất kỳ phương pháp mã hóa nào bạn tự tạo sẽ dễ dàng bị phá vỡ trong danh mục đó.

+0

Tôi nghĩ rằng mã hóa XOR sử dụng một khóa ngẫu nhiên là không thể phá vỡ. Vấn đề là quản lý chủ chốt. Bạn vẫn không gặp vấn đề gì với AES? – mhawke

+0

+1 Sau khi học lại nhanh chóng, điều tôi nói có lẽ đúng, nhưng việc quản lý khóa bằng mã hóa XOR khá khó sử dụng và khó hơn AES. XOR cũng dễ bị tấn công plaintext đã biết. – mhawke

+4

Nếu bạn sử dụng phím một lần và một lần duy nhất, do đó, một khóa khác nhau cho mỗi tin nhắn, bạn là chính xác. Đây là một pad thời gian. Tuy nhiên, một miếng đệm thời gian thực sự bất tiện vì bạn sẽ cần phải lưu trữ nhiều thông tin quan trọng như tin nhắn và cần phải được đồng ý trước với người gửi và người nhận! Với AES bạn có thể sử dụng cùng một khóa cho mỗi thư và chắc chắn (cho mục đích thực tế) mà không ai có thể giải mã tin nhắn của bạn mà không có chìa khóa. –

2

Yêu cầu chữ và số nghiêm ngặt như thế nào?

Làm cách nào để mã hóa base64 kết quả của hàm mã hóa hiện tại? Bạn có thể kết thúc bằng một vài ký tự đệm '=' đệm, nhưng bạn có thể cắt chúng và tính toán và xử lý phần đệm thừa.

def xor_crypt_string(plaintext, key): 
    ciphertext = ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(plaintext, cycle(key))) 
    return ciphertext.encode('base64') 

def xor_decrypt_string(ciphertext, key): 
    ciphertext = ciphertext.decode('base64') 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(ciphertext, cycle(key))) 
+0

Hoặc, theo đề xuất của câu trả lời khác, bạn có thể sử dụng mã hóa hex thay vì base64. – mhawke

+0

Tôi mệt mỏi, kết quả chứa nhiều ký tự đặc biệt. Tôi phải gửi chuỗi ký tự chữ và số này dưới dạng json được mã hóa cho người dùng. Không thể chơi với các ký tự đặc biệt –

+0

Sau đó sử dụng .encode ('hex'), kết quả là các chuỗi chỉ chứa 0-9 và a-f. Bạn nên nghiêm túc xem xét câu trả lời của Nick Craig-Wood. – mhawke

Các vấn đề liên quan