2016-02-28 117 views
3

我已經使用pycrypto模塊,用於加密和解密與RSA密鑰對和算法。問題是,當我嘗試加密大文件(文本文件10KB)讀取文件和加密它,當我把32字節的塊大小在pycrypto中用RSA解密大文件?

>>> f = open('10kb','rb') 
>>> p = open('enc','wb') 
>>> while True: 
     data = f.read(32) 
     if not data: 
      break 
     enc_data = public_key.encrypt(data,32) 
     p.write(enc_data[0]) 
    p.close() 
    f.close() 

它給人的輸出:

128 
128 
.......and the many 128 blocks it is writing 

當我嘗試解密加密的文件,我需要128字節塊讀它,從而給回32個字節的塊,

>>> f = open('enc','rb') 
>>> p = open('dec','wb') 
>>> while True: 
     data = f.read(128) 
     if not data: 
      break 
     dec_data = private_key.decrypt(data) 
     p.write(dec_data) 
    p.close() 
    f.close() 

這是給輸出:

32 
32 
.....so many 32 byte blocks it is decrypting, then 
128 
128 
128 
128 
Traceback (most recent call last): 
    File "<pyshell#251>", line 5, in <module> 
    enc_data = private_key.decrypt(data) 
    File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 174, in decrypt 
    return pubkey.pubkey.decrypt(self, ciphertext) 
    File "/usr/lib/python3/dist-packages/Crypto/PublicKey/pubkey.py", line 93, in decrypt 
     plaintext=self._decrypt(ciphertext) 
    File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 237, in _decrypt 
     cp = self.key._blind(ciphertext, r) 
    ValueError: Message too large 

要輸出塊大小爲32的點,它是正確的解密,但是它以128開頭,它搞砸了。爲什麼它說消息大小太大?有沒有更好更快的方法來解密使用pycrypto模塊的大文本文件?

+4

在這種「塊模式」下,不會爲RSA加密大文件。這不是非常安全和可怕的緩慢。改爲使用[混合加密](https://en.wikipedia.org/wiki/Hybrid_cryptosystem)。 –

+0

如何在pycrypto中做到這一點? –

+0

對不起,對我來說或多或少的OT點:我不知道prcrypto。是否將prcrypto限制爲處理32或128位等非常小的塊?如果RSA模數是1024比特,我無法想象這樣的小塊是用它來單獨加密的。如果您碰巧有時間,可以在s13.zetaboards.com/Crypto/topic/7234475/1/中嘗試使用我的Python代碼(請參閱Ex.3,它使用RSA處理模塊大小的塊塊密碼意義上的塊鏈接和認證),並告訴我你對它的評價。 –

回答

2

部分答案磨磨蹭蹭...


RSA適用於數字。當你序列化這些長整數時,你只能得到字節。由於這些數字沒有固定的大小,因此它們會按照必要的字節序列化,但不會更多。

的RSA加密C =米Ë MOD Ñ可導致密文,這是如此遠小於Ñ,不是所有的字節被填充時,由於前導零該號碼不必被序列化。

有時候(取決於模量和明文)可能發生,你在加密過程中寫一個127字節塊,而不是一個128字節塊,但解密過程中你常讀的128字節塊。這意味着,你正在從下一個塊取走一個字節。當對準發生時,您可以如塊比模量較大,因此不是一個有效的密文遇到各種隨機的行爲。

有兩種方法來解決:

  1. 之前,總是寫密文塊的長度。

    加密:

    data = f.read(readsize) 
    if not data: 
        break 
    i += 1 
    enc_data = public_key.encrypt(data, 32)[0] 
    
    p.write(chr(len(enc_data))) 
    p.write(enc_data) 
    

    解密:

    length = f.read(1) 
    if not length: 
        break 
    data = f.read(ord(length)) 
    print(length, len(data)) 
    j += 1 
    dec_data = private_key.decrypt(data) 
    p.write(dec_data[:readsize]) 
    

    在你不得不減少密文原始明文大小,到底是因爲你沒有PKCS#1 v1.5的工作填充或OAEP。

  2. 墊零個字節被加密過程中丟失。

    加密:

    data = f.read(readsize) 
    if not data: 
        break 
    i += 1 
    enc_data = public_key.encrypt(data, 32)[0] 
    
    while len(enc_data) < writesize: 
        enc_data = "\x00" + enc_data 
    p.write(enc_data) 
    

    解密:

    data = f.read(writesize) 
    if not data: 
        break 
    j += 1 
    dec_data = private_key.decrypt(data) 
    p.write(dec_data[:readsize]) 
    

注意readsize = 127writesize = 128Here是這兩個變體的完整源代碼。現在


,這是一個局部的答案,因爲這仍然會導致損壞的文件,這也太短了,但至少它修復了OP的錯誤。

+0

謝謝你的詳細的答案..我現在明白了:)雖然我的問題已經解決,但我很感謝你:) –