Tôi đang cố gắng hiểu PyCrypto hoạt động như thế nào trong một dự án nhưng tôi không hiểu đầy đủ ý nghĩa của Vector khởi tạo (IV). Tôi đã tìm thấy rằng tôi có thể sử dụng sai IV khi giải mã một chuỗi và tôi vẫn dường như để có được thông điệp trở lại ngoại trừ 16 byte đầu tiên (kích thước khối). Chỉ đơn giản là sử dụng nó sai hoặc không hiểu một cái gì đó?PyCrypto - Vector khởi tạo hoạt động như thế nào?
Dưới đây là một số mẫu mã để chứng minh:
import Crypto
import Crypto.Random
from Crypto.Cipher import AES
def pad_data(data):
if len(data) % 16 == 0:
return data
databytes = bytearray(data)
padding_required = 15 - (len(databytes) % 16)
databytes.extend(b'\x80')
databytes.extend(b'\x00' * padding_required)
return bytes(databytes)
def unpad_data(data):
if not data:
return data
data = data.rstrip(b'\x00')
if data[-1] == 128: # b'\x80'[0]:
return data[:-1]
else:
return data
def generate_aes_key():
rnd = Crypto.Random.OSRNG.posix.new().read(AES.block_size)
return rnd
def encrypt(key, iv, data):
aes = AES.new(key, AES.MODE_CBC, iv)
data = pad_data(data)
return aes.encrypt(data)
def decrypt(key, iv, data):
aes = AES.new(key, AES.MODE_CBC, iv)
data = aes.decrypt(data)
return unpad_data(data)
def test_crypto():
key = generate_aes_key()
iv = generate_aes_key() # get some random value for IV
msg = b"This is some super secret message. Please don't tell anyone about it or I'll have to shoot you."
code = encrypt(key, iv, msg)
iv = generate_aes_key() # change the IV to something random
decoded = decrypt(key, iv, code)
print(decoded)
if __name__ == '__main__':
test_crypto()
Tôi đang sử dụng Python 3.3.
Output sẽ thay đổi tùy tình hình thực hiện, nhưng tôi nhận được một cái gì đó như thế này: b"1^,Kp}Vl\x85\x8426M\xd2b\x1aer secret message. Please don't tell anyone about it or I'll have to shoot you."
okay, tôi nghĩ rằng tôi hiểu ... Tôi nghĩ rằng có thể các văn bản được mã hóa sẽ chỉ được thay đổi cho khối đầu tiên, nhưng nó dường như ảnh hưởng đến toàn bộ chuỗi byte. Nó có vẻ như một thực tế phổ biến là để thêm IV vào mã được mã hóa trước khi gửi, vì vậy tôi nghĩ rằng tôi sẽ làm điều đó. –