문제

저는 설치 프로그램을 통해 Windows 사용자에게 배포할 Python 프로그램을 만들고 있습니다.

프로그램은 사용자의 공개 키로 암호화된 파일을 매일 다운로드한 후 해독할 수 있어야 합니다.

따라서 공개 및 개인 PGP 키를 생성하고 공개 키로 암호화된 파일을 해독할 수 있는 Python 라이브러리를 찾아야 합니다.

이것이 pyCrypto가 수행할 작업입니까(문서가 모호함)?다른 순수 Python 라이브러리가 있나요?어떤 언어로든 독립형 명령줄 도구를 사용하는 것은 어떻습니까?

지금까지 본 것은 GNUPG뿐이었지만 이를 Windows에 설치하면 레지스트리에 문제가 발생하고 모든 곳에 dll이 발생합니다. 그런 다음 사용자가 이미 이 항목을 설치했는지 여부, 기존 키링을 백업하는 방법 등에 대해 걱정해야 합니다.차라리 Python 라이브러리나 명령줄 도구를 갖고 키를 직접 관리하고 싶습니다.

업데이트:pyME는 작동할 수도 있지만 제가 사용해야 하는 Python 2.4와 호환되지 않는 것 같습니다.

도움이 되었습니까?

해결책

당신은 필요하지 않습니다 PyCrypto 또는 PyMe, 그 패키지는 괜찮을 수 있지만, 창문 아래에 모든 종류의 문제가 구축 될 것입니다. 대신, 토끼 구멍을 피하고 내가 한 일을하지 않겠습니까? 사용 gnupg 1.4.9. 최종 사용자 머신에 전체 설치를 할 필요가 없습니다. gpg.exe 그리고 iconv.dll 분포에서 충분히 충분하며 경로 어딘가에 있거나 전체 PathName을 사용하여 Python 코드에서 액세스하면됩니다. 레지스트리를 변경할 필요가 없으며 원하는 경우 모든 (실행 파일 및 데이터 파일)를 단일 폴더로 제한 할 수 있습니다.

모듈이 있습니다 GPG.py 이는 원래 Andrew Kuchling이 작성했으며 Richard Jones가 개선했으며 Steve Traugott에 의해 더욱 향상되었습니다. 사용할 수 있습니다 여기, 그러나 사용하기 때문에 Windows에 적합하지 않습니다. os.fork(). 원래의 일부 PyCrypto, 그것은 다른 부분과 완전히 독립적입니다 PyCrypto 작업하려면 gpg.exe/iconv.dll 만 필요합니다..

버전이 있습니다 (gnupg.py) Traugott의 파생 GPG.py, subprocess 기준 치수. 적어도 내 목적을 위해 Windows에서 잘 작동합니다. 다음을 수행하는 데 사용합니다.

  • 키 관리 - 생성, 목록, 수출 등
  • 외부 소스에서 키를 가져 오기 (예 : 파트너 회사로부터받은 공개 키)
  • 데이터를 암호화하고 해독합니다
  • 서명 및 서명을 확인하십시오

내가 가진 모듈은 지금 보여주기에 이상적이지 않습니다. 다른 것들이 포함되어 있지 않아야하기 때문에 지금은 해제 할 수 없습니다. 어느 시점에서, 아마도 몇 주 안에, 나는 그것을 정리하고, 더 많은 단위 테스트를 추가 할 수 있기를 희망합니다 (예를 들어 서명/확인에 대한 단위 테스트가 없습니다). 원래 PyCrypto 라이센스 또는 유사한 상업용 친화적 라이센스). 기다릴 수 없다면 Traugott의 모듈과 함께 가서 직접 수정하십시오. subprocess 기준 치수.

이 접근법은 다른 것보다 훨씬 덜 고통 스러웠습니다 (예 : SWIG-기반 솔루션 또는 건물이 필요한 솔루션 MinGW/MSYS), 나는 고려하고 실험했다. 나는 같은 것을 사용했다 (gpg.exe/iconv.dll) 다른 언어로 작성된 시스템과 접근, 예를 들어 C#, 똑같이 고통스러운 결과를 얻었습니다.

추신 : Python 2.4 및 Python 2.5 이상에서 작동합니다. 다른 버전으로 테스트하지는 않지만 문제는 없습니다.

다른 팁

많은 파기 후, 나는 나를 위해 일한 패키지를 찾았습니다. 키의 생성을 지원한다고 말하지만 테스트하지 않았습니다. 그러나 GPG 공개 키를 사용하여 암호화 된 메시지를 암호화 할 수있었습니다. 이 패키지의 장점은 기계에 GPG 실행 파일이 필요하지 않으며 실행 파일 주변의 래퍼가 아닌 OpenPGP의 파이썬 기반 구현이라는 것입니다. Windows 용 GPG4Win 및 Kleopatra를 사용하여 개인 및 공개 키를 만들었습니다. 아래 코드를 참조하십시오.

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)

질문은 아주 오래되었지만. 이것이 미래의 사용자에게 도움이되기를 바랍니다.

PyCrypto supports PGP - albeit you should test it to make sure that it works to your specifications.

Although documentation is hard to come by, if you look through Util/test.py (the module test script), you can find a rudimentary example of their PGP support:

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 provides for the following relevant methods:

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

파이미 Python 2.4와의 완전한 호환성을 주장하며 다음을 인용합니다.

PyMe의 최신 버전(현재 쓰기)는 v0.8.0입니다.바이너리 데비안용 배포판이 컴파일되었습니다. SWIG v1.3.33 및 GCC v4.2.3 GPGME v1.1.6 및 Python v2.3.5, v2.4.4 및 v2.5.2( 당시 '불안정한' 분포).Windows용 바이너리 배포 SWIG v1.3.29로 컴파일되었으며 GPGME v4.1 및 Python용 MinGW v1.1.6 v2.5.2 (동일한 바이너리가 v2.4.2에서 다음과 같이 설치되고 잘 작동합니다. 글쎄).

왜 "내가 사용해야 하는 Python 2.4와 호환되지 않는 것 같습니다"라고 말씀하시는지 잘 모르겠습니다. 구체적인 내용을 알려주세요.

그리고 그렇습니다. GPGME에는 반 Python(SWIGd) 래퍼로 존재합니다. 이는 기본적으로 작업을 수행하는 C 라이브러리가 있으면 Python 확장을 개발하는 데 널리 사용되는 방법입니다.

PyPgp 훨씬 더 간단한 접근 방식을 가지고 있습니다. 이것이 바로 단일하고 간단한 Python 스크립트인 이유입니다.기본적으로 명령줄 PGP 명령에 대해 "쉘 아웃"만 수행합니다.예를 들어 암호 해독은 다음과 같습니다.

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

즉, 암호화된 암호문을 표준 입력에 기록합니다. pgpv -f, pgpv의 표준 출력을 해독된 일반 텍스트로 읽습니다.

PyPgp는 매우 오래된 프로젝트이지만 단순하다는 것은 최신 Python(예: 현재 사용되지 않는 os.popen2 대신 하위 프로세스)에서 작동하도록 만드는 것이 어렵지 않다는 것을 의미합니다.하지만 여전히 필요해요 PGP 설치되지 않으면 PyPgp가 아무 작업도 수행하지 않습니다. ;-).

M2Crypto PGP 모듈이 있지만 실제로 사용하려고 시도한 적이 없습니다. 당신이 그것을 시도하고 그것이 효과가 있다면, 저에게 알려주십시오 (나는 현재 m2crypto 관리자입니다). 일부 링크 :

업데이트: PGP 모듈은 키를 생성하는 방법을 제공하지 않지만 아마도 하위 레벨로 만들 수 있습니다. RSA, DSA 등 모듈. PGP 내부를 알지 못하므로 세부 사항을 파야합니다. 또한 OpenSSL 명령 행 명령을 사용하여 이러한 생성 방법을 알고 있다면이를 M2Crypto 호출로 쉽게 변환 할 수 있어야합니다.

다른 사람이 지적했듯이, Pyme은 GNUPG 생태계의 일부인 GPGME를 기반으로하기 때문에 이에 대한 표준 솔루션입니다.

Windows의 경우 사용하는 것이 좋습니다 gpg4win GNUPG 분포로서 두 가지 이유가 있습니다.

그것은 무엇보다도 GNUPG 2를 기반으로합니다. gpg2.exe, (마지막으로, 나는 추가 할 수 있습니다 :) 시작할 수 있습니다. gpg-agent.exe 주문형 (GPG v1.x 할 수 없습니다).

둘째, GNUPG 개발자가 유일한 공식 Windows 빌드입니다. 예를 들어 Linux에서 Windows로 전적으로 크로스 컴파일되었으므로 무료 소프트웨어의 IOTA 가이 제품을 준비하는 데 사용되지 않았습니다 (보안 스위트에 매우 중요합니다 :).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top