2015-01-16 11 views
3

이 문제에 대한 해결책을 찾지 못했기 때문에 여기가 내 첫 번째 질문입니다. 바라건대 누군가이 문제에 대한 해답을 갖고 있기를 바랍니다.라이브러리 pyApenSSL을 사용하여 DSA에 메시지 등록

DSA (디지털 서명 알고리즘) 및 pyOpenSSL 래퍼를 사용하여 메시지에 서명하고 확인하려고합니다. 나는 다음과 같은 결과를 얻을 것이다이 코드 조각을 실행 한 후

from OpenSSL.crypto import TYPE_DSA, Error, PKey 
from OpenSSL.crypto import FILETYPE_PEM, sign 
from Crypto.Hash import SHA 
key = PKey() 
key.generate_key(TYPE_DSA, 1024) 
message = "abc" 
digest = SHA.new(message).digest() 
data_to_sign = base64.b64encode(digest) 
signature = sign(key, data_to_sign, 'sha1') 

:

나는 아래의 예를 만들었습니다

나는 해결책을 발견했습니다

OpenSSL.crypto.Error: [('digital envelope routines', 'EVP_SignFinal', 'wrong public key type')] 
+0

EVP_Sign * 및 EVP_Verify *는 이전 인터페이스입니다. 새로운 OpenSSL 장비 인'EVP_DigestSign *'과'EVP_DigestVerify *'를 사용해야합니다. – jww

+0

DSA가 TLS 1.3에서 삭제됩니다. 분명히, 아무도 그것을 사용하고 있습니다. RSA 및 ECDSA를 사용하십시오. TLS 1.3 *은'ed25519'를 포함 할 수도 있습니다. – jww

답변

2

을,하지만 난 사용 다른 파이썬 라이브러리. Mac에서 사용중인 OpenSSL 라이브러리가 저에게 적합하지 않았습니다. 4096 비트 키를 사용하고 있으며 라이브러리가이를 지원하지 않습니다. 내 리눅스 상자에 다음 스크립트가 작동했습니다.

from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives import interfaces 
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key 
from cryptography.hazmat.primitives import hashes 
from cryptography.exceptions import InvalidSignature 

pem_data = contents = open('./pri.pem').read() 
pem_public_data = contents = open('./pub.pem').read() 
key = load_pem_private_key(pem_data, password=None, backend=default_backend()) 
if isinstance(key, interfaces.DSAPrivateKey): 
    msg = b"abc" 
    signer = key.signer(hashes.SHA1()) 
    signer.update(msg) 
    signature = signer.finalize() 
    public_key = load_pem_public_key(pem_public_data, backend=default_backend()) 
    verifier = public_key.verifier(signature, hashes.SHA1()) 
    verifier.update(msg) 
    try: 
     verifier.verify() 
     print 'Signature is valid' 
    except InvalidSignature: 
     print 'InvalidSignature' 
+0

감사합니다. Minh, 많은 검색을 한 후, 이것은 Python으로 DSA 개인 키로 메시지에 서명하는 데 가장 유용한 게시물이었습니다. – Hassek