2009-02-27 49 views
9

Tôi chưa tìm thấy cách tải khóa cá nhân RSA từ tệp PEM để sử dụng nó trong python-crypto (chữ ký).Cách tải khóa RSA từ tệp PEM và sử dụng khóa đó trong python-crypto

python-openssl có thể tải tệp PEM nhưng đối tượng PKey không thể được sử dụng để truy xuất thông tin quan trọng (p, q, ...) để sử dụng với Crypto.PublicKey.construct().

+0

Vào tháng 7 năm 2014, [PEM Pack] (http://www.cryptopp.com/wiki/PEM_Pack) đã được thêm vào thư viện Crypto ++. Gói PEM là một phần thực hiện mã hóa thư cho phép bạn đọc và viết các khóa và tham số mã hóa PEM, bao gồm các khóa riêng được mã hóa. Các tệp bổ sung bao gồm hỗ trợ cho các khóa RSA, DSA, EC, ECDSA và các tham số Diffie-Hellman. Đó là một add-on cho thư viện, và không phải là một phần của thư viện phù hợp. Bạn tải xuống một tệp ZIP và thêm năm tệp nguồn vào thư viện. Sau đó, bạn xây dựng thư viện (Crypto ++ tự động chọn chúng). – jww

+0

Liên quan: [Tải mã khóa RSA riêng được mã hóa PEM trong Crypto ++] (http://stackoverflow.com/questions/9815001/load-pem-encoded-private-rsa-key-in-crypto?rq=1) – jww

Trả lời

6

là điều này (gần) những gì bạn đã thử làm không?

public_key_filename = 'public_key.pem' 
rsa = M2Crypto.RSA.load_pub_key(pk) 

Điều đó sẽ hiệu quả. Vấn đề có thể là với openssl quá, nó hoạt động khi bạn chỉ cần sử dụng openssl (không phải trong Python)?

Link to Me Too Crypto

+0

điều này * NOT * làm việc cho tôi – Kimvais

+0

Điều này không thể hoạt động vì load_pub_key() mong đợi một tài nguyên tệp. Tải dữ liệu vào BIO bằng M2Crypto.BIO.MemoryBuffer (public_key_pem) và tải khóa công khai bằng M2Crypto.RSA.load_pub_key_bio (sinh học). –

12

Tôi khuyên bạn nên M2Crypto thay vì python-crypto. Bạn sẽ cần M2Crypto để phân tích cú pháp PEM và EVP api của nó giải phóng mã của bạn từ tùy thuộc vào một thuật toán cụ thể.

private = """ 
-----BEGIN RSA PRIVATE KEY----- 
MIIBOwIBAAJBANQNY7RD9BarYRsmMazM1hd7a+u3QeMPFZQ7Ic+BmmeWHvvVP4Yj 
yu1t6vAut7mKkaDeKbT3yiGVUgAEUaWMXqECAwEAAQJAIHCz8h37N4ScZHThYJgt 
oIYHKpZsg/oIyRaKw54GKxZq5f7YivcWoZ8j7IQ65lHVH3gmaqKOvqdAVVt5imKZ 
KQIhAPPsr9i3FxU+Mac0pvQKhFVJUzAFfKiG3ulVUdHgAaw/AiEA3ozHKzfZWKxH 
gs8v8ZQ/FnfI7DwYYhJC0YsXb6NSvR8CIHymwLo73mTxsogjBQqDcVrwLL3GoAyz 
V6jf+/8HvXMbAiEAj1b3FVQEboOQD6WoyJ1mQO9n/xf50HjYhqRitOnp6ZsCIQDS 
AvkvYKc6LG8IANmVv93g1dyKZvU/OQkAZepqHZB2MQ== 
-----END RSA PRIVATE KEY----- 
"""  
message = "python-crypto sucks" 

# Grab RSA parameters e, n 
from M2Crypto import RSA, BIO 
bio = BIO.MemoryBuffer(private) 
rsa = RSA.load_key_bio(bio) 
n, e = rsa.n, rsa.e 

# In Python-crypto: 
import Crypto.PublicKey.RSA 
pycrypto_key = Crypto.PublicKey.RSA.construct((n, e)) 

# Use EVP api to sign message 
from M2Crypto import EVP 
key = EVP.load_key_string(private) 
# if you need a different digest than the default 'sha1': 
key.reset_context(md='sha256') 
key.sign_init() 
key.sign_update(message) 
signature = key.sign_final() 

# Use EVP api to verify signature 
public = """ 
-----BEGIN PUBLIC KEY----- 
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANQNY7RD9BarYRsmMazM1hd7a+u3QeMP 
FZQ7Ic+BmmeWHvvVP4Yjyu1t6vAut7mKkaDeKbT3yiGVUgAEUaWMXqECAwEAAQ== 
-----END PUBLIC KEY----- 
""" 
from M2Crypto import BIO, RSA, EVP 
bio = BIO.MemoryBuffer(public) 
rsa = RSA.load_pub_key_bio(bio) 
pubkey = EVP.PKey() 
pubkey.assign_rsa(rsa) 
pubkey.reset_context(md="sha256") 
pubkey.verify_init() 
pubkey.verify_update(message) 
assert pubkey.verify_final(signature) == 1 

Xem http://svn.osafoundation.org/m2crypto/trunk/tests/test_rsa.py, nhưng tôi thích sử dụng các thuật toán độc lập EVP API http://svn.osafoundation.org/m2crypto/trunk/tests/test_evp.py.

How do you verify an RSA SHA1 signature in Python? giải quyết một vấn đề tương tự.

+0

Điều này không hiệu quả đối với tôi. Tôi nhận được 'assert isinstance (n, long)' trên dòng 'pycrypto_key = Crypto.PublicKey.RSA.construct ((n, e))'. n và e là các chuỗi - không dài. Bất kỳ ý tưởng? – bbrame

Các vấn đề liên quan