Pergunta

Eu estou fazendo um programa em Python para ser distribuído para os usuários do windows através de um instalador.

O programa precisa ser capaz de baixar um arquivo de cada dia criptografada com a chave pública do usuário e, em seguida, descriptografá-lo.

Então eu preciso encontrar uma biblioteca em Python que permitem gerar públicas e privadas de chaves PGP, e também descriptografar arquivos criptografados com a chave pública.

Isto é algo que pyCrypto vai fazer (a documentação está nebulosos)?Existem outros puro Python a bibliotecas?Como cerca de um autônomo ferramenta de linha de comando em qualquer idioma?

Tudo o que eu vi até agora foi o GNUPG, mas a instalação que o Windows faz coisas para o registro e lança a dll em qualquer lugar, e então eu tenho de me preocupar se o usuário já tenha instalado, como cópia de segurança existente, chaveiros, etc.Eu gostaria apenas de ter uma biblioteca em python ou a ferramenta de linha de comando e gerenciar as chaves-me.

Atualização:pyME podem funcionar, mas não parece ser compatível com o Python 2.4, que eu tenho que usar.

Foi útil?

Solução

Você não precisa de PyCrypto ou PyMe, multa de que esses pacotes poderão ser - você vai ter todos os tipos de problemas de construção em Windows.Em vez disso, por que não evitar o coelho-buracos e fazer o que eu fiz?Utilização gnupg 1.4.9.Você não precisa fazer uma instalação completa em computadores de utilizadores finais - apenas gpg.exe e iconv.dll a partir da distribuição são suficientes, e você só precisa tê-los em algum lugar no caminho ou acessado a partir de seu código Python usando um nome de caminho completo.Sem alterações para o registro são necessários e tudo (os executáveis e arquivos de dados) pode ser confinado a uma única pasta, se você desejar.

Há um módulo de GPG.py que foi originalmente escrito por Andrew Kuchling, melhorada por Richard Jones e melhorou ainda mais por Steve Traugott.Ele está disponível aqui, mas como é que ela não é adequada para o Windows porque ele usa os.fork().Embora originalmente parte de PyCrypto, ele é completamente independente de outras partes do PyCrypto e precisa de apenas gpg.exe/iconv.dll para trabalhar.

Eu tenho uma versão (gnupg.py) derivados de Traugott do GPG.py, que usa o subprocess módulo.Ele funciona bem em Windows, pelo menos para os meus fins - de eu usá-lo para fazer o seguinte:

  • Gerenciamento de chave - geração, listagem, exportar, etc.
  • Importar chaves a partir de uma fonte externa (por exemplo,chaves públicas recebido de uma empresa parceira)
  • Criptografar e descriptografar dados
  • Para assinar e verificar assinaturas

O módulo que eu tenho não é o ideal para mostrar agora, porque ele inclui algumas outras coisas que não deveria estar ali - o que significa que eu não posso liberá-lo tal como está no momento.Em algum ponto, talvez no próximo par de semanas, eu espero ser capaz de arrumá-lo, acrescentar um pouco mais de testes de unidade (não tenho quaisquer testes de unidade para assinar/verificar, por exemplo) e liberá-lo (no original PyCrypto licença ou de uma licença semelhante comercial amigável de licença).Se você não pode esperar, vá com Traugott do módulo e modificar-se - não era muito trabalho para fazê-lo funcionar com o subprocess módulo.

Esta abordagem foi muito menos doloroso do que as outras (e.g. SWIGbaseado em soluções, ou soluções que requerem a construção com MinGW/MSYS), que eu considerava e experimentaram.Eu usei o mesmo (gpg.exe/iconv.dll a abordagem de sistemas escritos em outras linguagens, por exemplo, C#, igualmente indolor resultados.

P. S.Ele funciona com o Python 2.4, bem como o Python 2.5 e posterior.Não testei com outras versões, apesar de não prever qualquer problema.

Outras dicas

Depois de muita escavação, encontrei um pacote que funcionou para mim. Embora se diga que apoia a geração de chaves, eu não o testei. No entanto, consegui descriptografar uma mensagem criptografada usando uma chave pública GPG. A vantagem deste pacote é que ele não requer um arquivo executável GPG na máquina e é uma implementação baseada em Python do OpenPGP (em vez de um invólucro em torno do executável). Criei as chaves privadas e públicas usando GPG4WIN e KLEOPATRA para Windows, veja meu código abaixo.

import pgpy
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>)
key,_  = pgpy.PGPKey.from_file(<path to your private key>)
with key.unlock(<your private key passpharase>):
    print (key.decrypt(emsg).message)

Embora a pergunta seja muito antiga. Espero que isso ajude futuros usuários.

O Pycrypto suporta PGP - embora você deva testá -lo para garantir que ele funcione para suas especificações.

Embora seja difícil encontrar documentação, se você olhar através do Util/test.py (o script de teste do módulo), poderá encontrar um exemplo rudimentar do suporte do PGP:

if verbose: print '  PGP mode:',
obj1=ciph.new(password, ciph.MODE_PGP, IV)
obj2=ciph.new(password, ciph.MODE_PGP, IV)
start=time.time()
ciphertext=obj1.encrypt(str)
plaintext=obj2.decrypt(ciphertext)
end=time.time()
if (plaintext!=str):
    die('Error in resulting plaintext from PGP mode')
print_timing(256, end-start, verbose)
del obj1, obj2

FutHermore, PublicKey/PubKey.Py fornece os seguintes métodos relevantes:

def encrypt(self, plaintext, K)
def decrypt(self, ciphertext):
def sign(self, M, K):
def verify (self, M, signature):
def can_sign (self):
    """can_sign() : bool
    Return a Boolean value recording whether this algorithm can
    generate signatures.  (This does not imply that this
    particular key object has the private information required to
    to generate a signature.)
    """
    return 1

Pyme Reivindica a compatibilidade total com o Python 2.4, e eu cito:

A versão mais recente do Pyme (até o momento da redação) é v0.8.0. Sua distribuição binária para o Debian foi compilada com SWIG v1.3.33 e GCC v4.2.3 para GPGME v1.1.6 e Python v2.3.5, v2.4.4 e v2.5.2 (fornecidos na distribuição 'instável' na época). Sua distribuição binária para Windows foi compilada com SWIG v1.3.29 e Mingw v4.1 para GPGME v1.1.6 e Python v2.5.2 (embora o mesmo binário seja instalado e funcione bem na v2.4.2).

Não sei por que você diz "não parece ser compatível com o Python 2.4, que eu tenho que usar" - especificações, por favor?

E sim, ele existe como um invólucro semi-pitônico (SWIGD) no GPGME-essa é uma maneira popular de desenvolver extensões de Python depois de ter uma biblioteca C que basicamente faz o trabalho.

PypGP Tem uma abordagem muito mais simples-é por isso que é um script python simples e simples: basicamente não faz nada mais do que "Shell" para comandos PGP da linha de comando. Por exemplo, a descriptografia é apenas:

def decrypt(data):
    "Decrypt a string - if you have the right key."
    pw,pr = os.popen2('pgpv -f')
    pw.write(data)
    pw.close()
    ptext = pr.read()
    return ptext

ou seja, escreva o CypherText criptografado para a entrada padrão de pgpv -f, Leia a saída padrão do PGPV como o texto simples descriptografado.

O PypGP também é um projeto muito antigo, embora sua simplicidade signifique que fazê-lo funcionar com o Python moderno (por exemplo, subprocesso em vez de agora deprecitado OS.Popen2) não seria difícil. Mas você ainda precisa Pgp instalado, ou o PypGP não fará nada ;-).

M2CRYPTO Tem módulo PGP, mas na verdade nunca tentei usá -lo. Se você tentar e funcionar, informe -me (eu sou o atual mantenedor M2Crypto). Alguns links:

Atualizar: O módulo PGP não fornece maneiras de gerar chaves, mas presumivelmente elas podem ser criadas com o nível mais baixo RSA, DSA Módulos etc.. Não sei o interior do PGP, então você teria que desenterrar os detalhes. Além disso, se você souber como gerá -los usando os comandos da linha de comando OpenSSL, deve ser razoavelmente fácil convertê -los em chamadas M2Crypto.

Como outros observaram, o Pyme é a solução canônica para isso, pois é baseada no GPGME, que faz parte do ecossistema GNUPG.

Para o Windows, eu recomendo fortemente usar Gpg4win Como distribuição GNUPG, por dois motivos:

É baseado no GNUPG 2, que, entre outras coisas, inclui gpg2.exe, o que pode (finalmente, devo acrescentar :) Comece gpg-agent.exe sob demanda (gpg v1.x não pode).

E, em segundo lugar, é o único Windows oficial construído pelos desenvolvedores do GNUPG. Por exemplo, é totalmente compilado do Linux ao Windows; portanto, não foi usado um IOTA de software não livre na preparação (muito importante para uma suíte de segurança :).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top