मैं समझने की कोशिश कर रहा हूं कि कैसे एक परियोजना में PyCrypto उपयोग करने के लिए काम करता है लेकिन मैं प्रारंभिक वेक्टर (IV) के महत्व को पूरी तरह समझ नहीं रहा हूं। मैंने पाया है कि मैं स्ट्रिंग को डीकोड करते समय गलत चतुर्थ का उपयोग कर सकता हूं और मुझे अभी भी पहले 16 बाइट्स (ब्लॉक आकार) को छोड़कर संदेश वापस मिल रहा है। क्या मैं बस गलत इस्तेमाल कर रहा हूं या कुछ समझ नहीं रहा हूं?PyCrypto - प्रारंभिक वेक्टर कैसे काम करता है?
यहाँ एक नमूना कोड प्रदर्शित करने के लिए है:
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()
मैं अजगर 3.3 का उपयोग कर रहा हूँ।
आउटपुट निष्पादन पर अलग अलग होंगे, लेकिन मैं कुछ इस तरह मिलती है: b"1^,Kp}Vl\x85\x8426M\xd2b\x1aer secret message. Please don't tell anyone about it or I'll have to shoot you."
ठीक है, मुझे लगता है कि मैं समझता हूं ... मैंने सोचा कि शायद एन्क्रिप्टेड टेक्स्ट केवल पहले ब्लॉक के लिए बदला जाएगा, लेकिन ऐसा लगता है कि यह बाइट्स की पूरी श्रृंखला को प्रभावित करता है। ऐसा लगता है कि भेजने से पहले एवीप्टेड कोड में IV को प्रीपेड करना एक आम प्रथा है, इसलिए मुझे लगता है कि मैं ऐसा करने जा रहा हूं। –