Jak to udělat PGP v Pythonu (generování klíčů, šifrování / dešifrování)

hlasů
28

Dělám program v Pythonu, které mají být distribuovány uživatelům systémů Windows pomocí instalačního programu.

Tento program musí být schopen stáhnout soubor každý den zašifrována pomocí veřejného klíče uživatele a pak jej dešifrovat.

Takže musím najít knihovnu v jazyce Python, který bude dejte mi generovat veřejných a soukromých klíčů PGP a také dešifrovat soubory zašifrované pomocí veřejného klíče.

Je to něco, co bude dělat pyCrypto (dokumentace je mlhavý)? Existují další čisté Python knihovny? Jak se o samostatný nástroj pro příkazovou řádku v jakémkoli jazyce?

Všechno, co jsem viděl tak daleko byl GNUPG ale instalace, které na Windows dělá věci do registru a hodí dll je všude, a pak jsem se starat o to, zda je uživatel již byl tento instalován, jak zálohovat své stávající klíčenky, atd. Raději stačí mít python knihovnu nebo nástroj příkazového řádku a administrovat klíčů sám.

Aktualizace: pyME by mohlo fungovat, ale nezdá se, že je kompatibilní s Python 2.4, který mám použít.

Položena 19/06/2009 v 23:28
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
27

Nepotřebujete PyCryptoani PyMejemný když tyto balíčky mohou být - budete mít všechny druhy problémů budově pod Windows. Místo toho, proč se vyhnout králičí díry a dělat to, co jsem udělal? Použít gnupg 1.4.9. Nepotřebujete k tomu plnou instalaci na koncových uživatelů strojů - jen gpg.exea iconv.dllod rozdělení jsou dostatečné, a stačí je mít někde na cestě, nebo přistupovat z Pythonu pomocí úplnou cestu. Nejsou potřeba žádné změny v registru, a všechno (spustitelné soubory a datové soubory) mohou být omezena na jediné složky, pokud chcete.

K dispozici je modul GPG.py, který byl původně napsán Andrew Kuchling, zlepšení Richard Jones a zlepšila dále Steve Traugott. To je k dispozici zde , ale tak, jak je, že to není vhodný pro Windows, protože používá os.fork(). Ačkoli původně součástí PyCrypto, je zcela nezávislý na ostatních částech PyCrypto, a potřebuje pouze gpg.exe / iconv.dll aby se do práce .

Mám verzi ( gnupg.py) odvozené od Traugott to GPG.py, který používá subprocessmodul. To funguje pod Windows, alespoň pro mé účely - Používám ho provést následující:

  • Správa klíčů - generování, výpis, export atd.
  • Import klíče z externího zdroje (např veřejné klíče obdržel od partnerské společnosti)
  • Šifrování a dešifrování dat
  • Podepsat a ověřovat podpisy

Modul mám není ideální ukázat právě teď, protože obsahuje některé další věci, které by tam nemělo být - což znamená, že jej neuvolní tak, jak je v současné době. Na nějakém místě, možná v příštích několika týdnech, doufám, že budu moci uklidit to, přidat nějaké další unit testy (nemám žádné unit testy na znamení / ověření, například) a uvolněte (buď na základě původní PyCryptolicence nebo podobné obchodní jednání licence). Pokud nemůžete čekat, jít s modulem Traugott a upravovat sami - to nebylo příliš mnoho práce, aby to fungovalo s subprocessmodulem.

Tento přístup byl mnohem méně bolestivé než ostatní (např SWIGzaložené řešení, nebo řešení, která vyžadují budova s MinGW/ MSYS), které jsem považoval a experimentoval. Použil jsem stejný ( gpg.exe/ iconv.dllpřístupu se systémy psaných v jiných jazycích, například) C#, se stejně bezbolestné výsledky.

PS Pracuje s Python 2.4, stejně jako Python 2.5 a novější. Nebyl testován s jinými verzemi, když jsem nepředpokládají žádné problémy.

Odpovězeno 27/06/2009 v 23:12
zdroj uživatelem

hlasů
6

PyCrypto podporuje PGP - i když byste měli provést test, aby se ujistil, že funguje podle vašich požadavků.

Ačkoli dokumentace je těžké přijít, když se podíváte přes util / test.py (zkušební modul skript), můžete najít primitivní příklad jejich podporu 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 stanoví následující příslušné metody:

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
Odpovězeno 24/06/2009 v 09:30
zdroj uživatelem

hlasů
3

M2Crypto má PGP modul, ale já jsem ve skutečnosti nikdy se snažil používat. Pokud si to vyzkoušet, a to funguje, dejte mi prosím vědět (I am proud M2Crypto udržovatel). Některé odkazy:

Aktualizace: Modul PGP neposkytuje způsoby, jak generovat klíče, ale pravděpodobně by mohly být vytvořeny s nižší úrovní RSA , DSA, atd. Moduly. Nevím PGP vnitřnosti, takže budete muset vykopat podrobnosti. Také, pokud víte, jak generovat tyto pomocí příkazů příkazového řádku openssl, mělo by být poměrně snadno převést, že k M2Crypto volání.

Odpovězeno 25/06/2009 v 05:10
zdroj uživatelem

hlasů
2

Jak je již uvedeno jiné, PyMe je kanonická řešení pro toto, protože je založen na GpgME, který je součástí GnuPG ekosystému.

Pro Windows, důrazně doporučujeme použít Gpg4win jako distribuce GnuPG, ze dvou důvodů:

Je založen na GnuPG 2, která mimo jiné obsahuje gpg2.exe, který může (konečně, mohl bych dodat :) spustit gpg-agent.exeon-demand (gpg v1.x nemůže).

A za druhé, že je to jediný oficiální Windows stavět vývojáři GnuPG. Například to je úplně cross-sestavují z Linuxu na Windows, takže není jota of non-free software byl použit v přípravě to (velmi důležité pro zabezpečení sady :).

Odpovězeno 31/07/2009 v 19:26
zdroj uživatelem

hlasů
2

PyMe dělá nárok na plnou kompatibilitu s Python 2.4, cituji:

Nejnovější verze PyMe (jak tohoto psaní) je v0.8.0. Jeho binární distribuce pro Debian byl sestaven s SWIG v1.3.33 a GCC v4.2.3 pro GPGME v1.1.6 a Python v2.3.5, v2.4.4 a v2.5.2 (poskytnuté v nestabilní 'distribuci v té době). Jeho binární distribuce pro Windows byl sestaven s SWIG v1.3.29 a MinGW v4.1 pro GPGME v1.1.6 a Python v2.5.2 (ačkoli stejný binární instalují a funguje v v2.4.2 stejně).

Nejsem si jistý, proč říkáte, „to se nezdá být v souladu s Python 2.4, které jsem musel použít“ - specifika, prosím?

A ano, to neexistuje jako semi-Pythonic (SWIGd) obalu o GPGME - to je populární způsob, jak vyvíjet rozšíření Pythonu, až budete mít knihovnu C, který v podstatě dělá svou práci.

PyPgp má mnohem jednodušší přístup - to je důvod, proč je to jediný, jednoduchý skript v jazyce Python: v podstatě nedělá nic víc než „vysolit“ do příkazového řádku příkazy PGP. Například, dešifrování je prostě:

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

tedy psát šifrované cyphertext do standardního vstupu pgpv -f, bude čten standardní výstup pgpv jako dekódovaného prostého textu.

PyPgp je také velmi starý projekt, ačkoli jeho jednoduchost znamená, že dělat to pracovat s moderním Python (např podproces namísto dnes již zastaralé os.popen2) by nemělo být těžké. Ale stále potřebujeme PGP nainstalováno nebo PyPgp nebude dělat nic ;-).

Odpovězeno 24/06/2009 v 17:03
zdroj uživatelem

hlasů
1

Po dlouhém kopání, jsem zjistil, balíček, který pracoval pro mě. I když se říká, k podpoře vytváření klíčů, neměl jsem to vyzkoušet. Nicméně jsem se podařilo dešifrovat zprávu, která byla zašifrována pomocí veřejného klíče GPG. Výhodou tohoto balení je, že nevyžaduje spustitelný soubor GPG na stroji, a je Python založené implementace OpenPGP (spíše než obal kolem spustitelný soubor) a. Vytvořil jsem na soukromé a veřejné klíče pomocí GPG4win a Kleopatra pro okna Viz můj kód níže.

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)

Ačkoli otázka je velmi stará. Doufám, že to pomůže budoucím uživatelům.

Odpovězeno 10/10/2017 v 11:41
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more