检查文件是否是有效的pgp加密文件

时间:2016-09-01 13:39:47

标签: encryption gnupg

我需要检查文件是否是有效的pgp加密文件。我们得到的一些pgp文件有pgp的扩展名,而有些则不行。我需要检查哪些文件是pgp加密文件,哪些不是。如果有办法告诉我们,请告诉我。

2 个答案:

答案 0 :(得分:2)

The only certain way is to attempt decrypting the file (e.g. with gpg) and interpret the error output. Unless you limit input to ascii-armored files, in that case you can check for the armor.

答案 1 :(得分:2)

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

context = gpgme.Context()
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方法成功。显然,该文件是一个正确加密的文件。