2016-09-01 114 views
2

我需要檢查文件是否是有效的pgp加密文件。我們得到的一些pgp文件有pgp的擴展名,有些不。我需要檢查哪些文件是pgp加密文件,哪些不是。請讓我知道是否有辦法說明。檢查文件是否是有效的pgp加密文件

+2

查看使用它的'libmagic'和'file'命令。 –

回答

2

唯一確定的方法是嘗試解密文件(例如使用gpg)並解釋錯誤輸出。除非你將輸入限制爲ascii-armored文件,在這種情況下,你可以檢查裝甲。

1

python-gpgme library是GPGME的Pythonic包裝,該庫允許編程式GnuPG訪問。

如果您有可能會或可能不會GnuPG的加密某些文件:

$ head --bytes=1024k </dev/urandom> lorem 
$ head --bytes=1024k < /dev/urandom | gpg --encrypt --recipient DEADBEEF > ipsum 

隨着gpgme模塊,你可以嘗試解密文件:

import gpgme 
import io 

for infile_path in ['lorem', 'ipsum']: 
    with open(infile_path, 'rb') as infile: 
     outfile = io.BytesIO() 
     try: 
      context.decrypt(infile, outfile) 
     except gpgme.GpgmeError as exc: 
      if exc.code == gpgme.ERR_NO_DATA: 
       print(
        "Not a GnuPG-encrypted file: ‘{path}’ ({error})".format(
         path=infile.name, error=exc.strerror)) 
      else: 
       print(
        "Error decrypting file: ‘{path}’ ({error})".format(
         path=infile.name, error=exc.strerror)) 
     else: 
      print("Successfully decrypted: ‘{path}’".format(
       path=infile.name)) 

也就是說,您可以處理三個條件:

  • gpgme.Context.decrypt方法失敗,錯誤代碼是gpgme.ERR_NO_DATA。這意味着數據流不被識別爲GnuPG加密的數據。

  • 由於其他原因,gpgme.Context.decrypt方法失敗。你需要決定你在這裏關心的其他錯誤。

  • gpgme.Context.decrypt方法成功。顯然,該文件是一個正確加密的文件。

+0

使用Python 2.7.13運行給定的腳本我得到'NameError:name'context'未定義。 –