pycrypto: не удается расшифровать файл


Я использую крипто-алгоритм PKCS1_OAEP для шифрования файла. Файл успешно зашифрован, но не может расшифровать файл, получая ошибку " шифртекст с неправильной длиной."

Алгоритм шифрования здесь:

#!/usr/bin/python
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
import zlib
import base64


fd = open('test.doc', 'rb')
message = fd.read()
fd.close()

print "[*] Original File Size: %d" % len(message)

#message = 'To be encrypted'
key = RSA.importKey(open('pubkey.der').read())
cipher = PKCS1_OAEP.new(key)

compressed = zlib.compress(message)
print "[*] Compressed File Size: %d" % len(compressed)

chunk_size = 128

ciphertext = ""
offset = 0

while offset < len(compressed):
    chunk = compressed[offset:offset+chunk_size]

    if len(chunk) % chunk_size != 0:
        chunk += " " * (chunk_size - len(chunk)) # Padding with spaces

    ciphertext += cipher.encrypt(chunk)
    offset += chunk_size

print "[*] Encrypted File Size: %d" % len(ciphertext)

encoded = ciphertext.encode("base64")

print "[*] Encoded file size: %d" % len(encoded)

fd = open("enc.data", 'wb')
fd.write(encoded)
fd.close()

print "[+] File saved successfully!"

Алгоритм расшифровки здесь:

#!/usr/bin/python
from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA
import zlib
import base64

key = RSA.importKey(open('privkey.der').read())
cipher = PKCS1_OAEP.new(key)

fd = open('enc.data', 'rb')
encoded = fd.read().strip('n')
fd.close()

decoded = encoded.decode("base64")


chunk_size = 128
offset = 0
plaintext = ""

while offset < len(decoded):
    plaintext += cipher.decrypt(decoded[offset:offset+chunk_size])
    offset += chunk_size

#plaintext = cipher.decrypt(decoded)

decompress = zlib.decompress(plaintext)


fd = open('decr.doc', 'wb')
fd.write(decompress)
fd.close()

Используя следующий скрипт для генерации ключа

from Crypto.PublicKey import RSA 

new_key = RSA.generate(2048, e=65537) 
public_key = new_key.publickey().exportKey("PEM") 
private_key = new_key.exportKey("PEM") 


fileWrite(fileName, data):
    fd = open(fileName, 'wb')
    fd.write(data)
    fd.close()

fileWrite('privkey.der', private_key)
fileWrite('pubkey.der', public_key)

Вот сообщение об ошибке

1 2

1 ответ:

Вы шифруете с помощью ключа RSA 2048 бит, который дает зашифрованные блоки 2048 бит (256 байт). Ваша реализация decrypt предполагает, что зашифрованные блоки составляют 128 байт , где на самом деле они составляют 256 байт, и таким образом вы получаете ошибку "неправильной длины". Обратите внимание, что размер зашифрованных файлов (64512) более чем вдвое превышает размер сжатого файла (32223).

В общем случае вы не будете использовать RSA для массового шифрования (поскольку это довольно медленный), но вместо этого объединил бы его с симметричным шифрованием, таким как AES. Затем вы зашифруете данные случайным ключом AES, а затем зашифруете ключ AES с помощью ключа RSA. Таким образом, вы получаете скорость AES и два ключа RSA. Это известно какгибридное шифрование .