2014-07-02 116 views
2

我使用PKCS#7使用python和填充來加密(tar)文件。這個加密文件然後發送到客戶端(一個帶有OpenWRT的路由器)。此路由器使用(linux)shell與openssl命令解密它。然而,這最後一步失敗,出現以下信息:openssl命令如何處理python添加的PKCS#7填充

bad decrypt 

2011837512:error:06065064:lib(6):func(101):reason(100):NA:0: 

tar: short read 

也許問題就出在填充,所以我想知道什麼樣的參數用於openssl以避免此問題。有沒有其他的命令與-nopad有關的填充?

以下Python代碼用於加密tar文件:

# Encrypt file 
def aes_encrypt_file(in_filename, out_filename, key, iv): 
block_size = AES.block_size 
pad = lambda s: s + (block_size - len(s) % block_size) \ 
        * chr(block_size - len(s) % block_size) 
cipher = aes_build_cipher(key, iv) 
with open(in_filename, 'rb') as infile: 
    with open(out_filename, 'wb') as outfile: 
     while True: 
      buf = infile.read(1024) 
      if len(buf) == 0: 
       break 
      elif len(buf) % block_size != 0: 
       buf = pad(buf) 
      outfile.write(cipher.encrypt(buf)) 

下面的shell命令用來解密路由器上的tar文件:

openssl aes-256-cbc -d -nosalt -K $sum256 -iv $iv -in ${PACKAGE} | tar xzf - 
+0

請重新閱讀的問題,你先解密,然後加密?發佈您的Python代碼和您擁有的任何openssl信息!目前這個問題太廣泛了。 –

+0

謝謝你的表揚。我想知道的是openssl如何知道我在解壓後的文件中是什麼?我是否適合在python代碼中填充的方法? – nideyangzi1989

+0

並原諒我的英語.. – nideyangzi1989

回答

1

一般來說,你在移動關於AES模式和填充的正確方向。但是,您不是填充和加密整個明文,而是每個(最多)1024個字節的塊。如果將其視爲單個加密文件,將無法正確解密,因此明文末尾的填充將不正確,您將看到失敗。

+0

非常感謝您所做的每一件事。我的tar文件大約200KB,並且它總是在小範圍內變化。實際上,我發現填充方法不是PKCS#7,因爲如果文件大小是block_size的倍數(這裏是16),它將永遠不會填充。因此,我更改了代碼並正在進行testint。 – nideyangzi1989

+0

我忘了說一個重要的事情,tar文件將每小時發送給客戶端,並且每10次發生一次錯誤。 – nideyangzi1989

+0

請在此信息中編輯。如果你不知道lambda,讀填充部分有點棘手。儘管如此,墊不應該在每個塊上執行;如果不是所有的1024字節都被讀取,那麼這個程序將會出錯。 –

1

問題解決了,下面的Python代碼是正確的。

# Encrypt file 
def aes_encrypt_file(in_filename, out_filename, key, iv): 
block_size = AES.block_size 
pad = lambda s: s + (block_size - len(s) % block_size) \ 
        * chr(block_size - len(s) % block_size) 
cipher = aes_build_cipher(key, iv) 
with open(in_filename, 'rb') as infile: 
    with open(out_filename, 'wb') as outfile: 
     buf = infile.read()  
     buf = pad(buf) 
     outfile.write(cipher.encrypt(buf)) 

@owlstead @jww非常感謝您的幫助

+0

Upvoted your Q/A。請注意,只是代碼塊不被視爲答案。您應該清楚地指出您在解答問題時所做的工作。 –

相關問題