3

Pythonの組み込みライブラリに問題がありますgzip。それに関する他のほとんどすべてのスタックの質問を調べましたが、どれも機能していないようです。

私の問題は、私が減圧しようとすると、IOError

私が得ている:

Traceback (most recent call last):
File "mymodule.py", line 61, in
  return gz.read()
File "/usr/lib/python2.7/gzip.py", line 245,
  readself._read(readsize)
File "/usr/lib/python2.7/gzip.py", line 287, in
  _readself._read_gzip_header()
File "/usr/lib/python2.7/gzip.py", line 181, in
  _read_gzip_header
raise IOError, 'Not a gzipped file'IOError: Not a gzipped file

これはネットワーク経由で送信するための私のコードです。なぜ私が物事を行うのか意味がないかもしれませんが、通常はwhileループでメモリ効率が高く、単純化しただけです。

buffer = cStringIO.StringIO(output) #output is from a subprocess call
small_buffer = cStringIO.StringIO()
small_string = buffer.read() #need a string to write to buffer 
gzip_obj = gzip.GzipFile(fileobj=small_buffer,compresslevel=6, mode='wb')
gzip_obj.write(small_string)
compressed_str = small_buffer.getvalue()

blowfish = Blowfish.new('abcd', Blowfish.MODE_ECB)
remainder = '|'*(8 - (len(compressed_str) % 8))
compressed_str += remainder
encrypted = blowfish.encrypt(compressed_str)
#i send it over smb, then retrieve it later

次に、これを取得するコードは次のとおりです。

#buffer is a cStringIO object filled with data from  retrieval
decrypter = Blowfish.new('abcd', Blowfish.MODE_ECB)
value = buffer.getvalue()
decrypted = decrypter.decrypt(value)
buff = cStringIO.StringIO(decrypted)
buff.seek(0)
gz = gzip.GzipFile(fileobj=buff)
return gz.read()

ここに問題があります

return gz.read()

4

1 に答える 1

1

編集:私は思う...あなたはそれを解凍する前にパディングを削除するのを忘れていました。以下のコードは私にとってはうまくいき、パディングを削除しないと同じエラーが発生します。

編集2:パディングの仕様:パディングを行う方法では、暗号化アルゴリズムでもパイプ文字を使用できると想定しているため、パディングのサイズを渡す必要があると思います。RFC 3852のセクション6.3によると、必要なパディングバイト数のバイナリ表現(ASCII番号ではない)でパディングする必要があります。仕様の解釈を行うために、以下のコードを更新しました。

import gzip
import cStringIO
from Crypto.Cipher import Blowfish

#gzip and encrypt
small_buffer = cStringIO.StringIO()
small_string = "test data"
with gzip.GzipFile(fileobj=small_buffer,compresslevel=6, mode='wb') as gzip_obj:
    gzip_obj.write(small_string)
compressed_str = small_buffer.getvalue()
blowfish = Blowfish.new('better than bad')
#remainder = '|'*(8 - (len(compressed_str) % 8))
pad_bytes = 8 - (len(compressed_str) % 8)
padding = chr(pad_bytes)*pad_bytes
compressed_str += padding
encrypted = blowfish.encrypt(compressed_str)
print("encrypted: {}".format(encrypted))



#decrypt and ungzip (pretending to be in a separate space here)
value = encrypted
blowfish = Blowfish.new('better than bad')
decrypted = blowfish.decrypt(value)
buff = cStringIO.StringIO(decrypted)
buff.seek(-1,2) #move to the last byte
pad_bytes = ord(buff.read(1)) #get the size of the padding from the last byte
buff.truncate(len(buff.getvalue()) - pad_bytes) #probably a better way to do this.
buff.seek(0)
with gzip.GzipFile(fileobj=buff) as gz:
    back_home = gz.read()
print("back home: {}".format(back_home))
于 2012-06-22T14:47:59.937 に答える