2013-07-08 35 views
7

Tôi rất mới để mã hóa, tôi cần phải mã hóa một chuỗi đơn giản như 'ABC123' thành một cái gì đó tương tự như '3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d'.làm thế nào để mã hóa/giải mã một chuỗi đơn giản

đầu tiên tôi đã cố gắng này:

>>> import base64 
>>> q = 'ABC123' 
>>> w = base64.encodestring(q) 
>>> w 
'QUJDMTIz\n' 

Nhưng nó để ngắn, tôi cần một cái gì đó còn hơn là tôi đã cố gắng này:

>>> import hashlib 
>>> a = hashlib.sha224(q) 
>>> a.hexdigest() 
'3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d' 

này là tốt, nhưng bây giờ tôi không biết làm thế nào để chuyển đổi nó trở lại. Nếu ai đó có thể giúp tôi eather với ví dụ này hoặc gợi ý cái gì khác, làm thế nào tôi có thể mã hóa/giải mã một chuỗi nhỏ thành một cái gì đó lâu hơn, sẽ là tuyệt vời.

CẬP NHẬT

dựa trên plockc câu trả lời tôi đã làm điều này, và có vẻ như để làm việc:

from Crypto.Cipher import AES # encryption library 

BLOCK_SIZE = 32 

# the character used for padding--with a block cipher such as AES, the value 
# you encrypt must be a multiple of BLOCK_SIZE in length. This character is 
# used to ensure that your value is always a multiple of BLOCK_SIZE 
PADDING = '{' 

# one-liner to sufficiently pad the text to be encrypted 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

# one-liners to encrypt/encode and decrypt/decode a string 
# encrypt with AES, encode with base64 
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

# create a cipher object using the random secret 
cipher = AES.new('aaaaaaaaaa123456') 

# encode a string 
encoded = EncodeAES(cipher, 'ABC123') 
print 'Encrypted string: %s' % encoded 

# decode the encoded string 
decoded = DecodeAES(cipher, encoded) 
print 'Decrypted string: %s' % decoded 
+4

Đó không phải là ý nghĩa của hàm băm. – SLaks

+2

Bảo mật là _hard_. Bạn đang cố bảo vệ kịch bản nào? – SLaks

+0

Tôi cần mã hóa một id tài khoản thành một cái gì đó dài hơn và giải mã nó trở lại khi tôi cần nó. – Vor

Trả lời

3

Bạn có thể cần phải xây dựng trên cách bạn sẽ sử dụng nó và tại sao, như bạn có chỉ đã mở hộp Pandora :)

Mã hóa có thể đảo ngược và chỉ được sử dụng để làm cho dữ liệu khớp với thứ khác (như dữ liệu nhị phân cơ bản 64 khi bạn chỉ có thể sử dụng văn bản), băm (như sha224) không được cho là có thể đảo ngược.

Nếu bạn muốn xác minh người dùng nhập mật khẩu, bạn băm nó (giống như sha224) và lưu trữ băm, sau đó khi người dùng nhập lại mật khẩu, bạn băm nhập và so sánh. Đây là phiên bản đơn giản, bạn cũng cần thêm "muối" để tránh "tấn công từ điển" đơn giản. Tôi sẽ không giải thích vì đó không phải là câu hỏi bạn hỏi.

Để trả lời nhanh câu hỏi bạn muốn một thư viện mã hóa, như mã hóa AES-128, có khóa bí mật và với khóa, bạn có thể khôi phục dữ liệu gốc. Sẽ có một số chi tiết trong thư viện về cách tạo khóa (nó phải là một chiều dài cụ thể và sẽ được thao tác để làm cho nó có chiều dài). Nếu khóa của bạn dựa trên mật khẩu đơn giản, hãy xem PBKDF2, khóa này tạo khóa mã hóa mạnh từ mật khẩu yếu.

Đừng nhầm lẫn hmac dưới dạng mã hóa (hmac sử dụng hàm khác, như hàm băm sha224), nếu người nhận thư chia sẻ khóa hmac với người gửi, họ có thể "xác thực" rằng thư có thể từ người gửi và nó không có sự thay đổi.

Chúc may mắn!

P.S. đây là một cuốn sách tốt nếu bạn thực sự muốn bắt đầu đào ở: Cryptography Kỹ thuật: nguyên tắc thiết kế và thực tiễn áp dụng

Một câu trả lời phổ biến liên quan: https://stackoverflow.com/a/4948393/1322463

Wikipedia cũng có bài viết tốt quá.

+0

tuyệt vời! Cảm ơn nhiều – Vor