2012-04-16 47 views
6

Tôi đang sử dụng thư viện commoncrypto trên iPhone để tạo một cặp khóa RSA và tôi đang cố gắng gửi khóa công khai tới máy chủ (Python) để tôi có thể sử dụng nó để xác minh một chữ ký được gửi từ điện thoại.Không thể tìm ra cách xuất bản khóa công khai được tạo trên iPhone

Tôi đang sử dụng mã chính xác từ ví dụ CommonCrypto sử dụng phương pháp getPublicKeyBits() mà trông như thế này:

`- (NSData ) getPublicKeyBits { OSStatus sanityCheck = noerr; NSData publicKeyBits = nil; NSData * publicTag = [[NSData alloc] initWithBytes: publicKeyIdentifier length: sizeof (publicKeyIdentifier)]; CFDataRef cfresult = NULL;

NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init]; 

// Set the public key query dictionary. 
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag]; 
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType]; 
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; 

// Get the key bits. 
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef*)&cfresult); 


if (sanityCheck != noErr) 
{ 
    publicKeyBits = nil; 
} 
else 
{ 
    publicKeyBits = (__bridge_transfer NSData *)cfresult; 
} 

return publicKeyBits; 

} `

Vấn đề là tôi không biết làm thế nào, chính xác, chìa khóa đang được lưu trữ hoặc làm thế nào để vượt qua nó. Tôi đang sử dụng getPublicKeyBits() để tải cấu trúc NSData và tôi đã nhập thư viện để mã hóa nó trong base64. Tôi nhận được một chìa khóa (SHA1, tôi muốn chuyển sang SHA256, nhưng đó là thứ yếu để làm việc này) và phiên bản base64 trông giống như các phím khác tôi đã tìm thấy ở đây và ở những người khác giải quyết các vấn đề RSA.

Tôi đã cố gắng sử dụng thư viện M2Crypto bằng Python và khi tôi cố gắng xác minh tôi nhận được lỗi "RSA Error: No Start Line". Dưới đây là đoạn code tôi đang sử dụng để nhận khóa công khai:

pubKey = request.form['publickey'] 

uid = uuid4().hex 
while not unique(uid, User): 
    uid = uuid.uuid4().hex 
user = User(uid, email, secret, pubKey) 

Và mã Tôi đang sử dụng để kiểm tra chữ ký:

def validate(sessionKey, sig, pem): 
    bio = BIO.MemoryBuffer(pem.encode('ascii')) 
    rsa = RSA.load_pub_key_bio(bio) 
    pubkey = EVP.PKey() 
    pubkey.assign_rsa(rsa) 

    pubkey.reset_context(md='sha1') 
    pubkey.verify_init() 
    pubkey.verify_update(sessionKey) 

    return pubkey.verify_final(sig) 

Tôi thực sự bối rối như những gì tôi làm sai nhưng tôi cảm thấy như tôi đang đến gần. Nếu toàn bộ phương pháp của tôi không phải là cách bạn làm, tôi rất muốn nghe bất kỳ cách nào khác để tạo khóa RSA trên điện thoại, xuất bản khóa công khai lên máy chủ và sau đó xác minh chữ ký từ điện thoại trên máy chủ đó .

Cảm ơn!

+0

bạn cũng có thể đăng mã iOS của mình mà bạn sử dụng để tạo dữ liệu khóa công khai không? – MrTJ

+0

bài được cập nhật với mã – brennen

Trả lời

1

Bạn có thể sử dụng getPublicKeyBits phương pháp từ SecKeyWrapper trong mã của Apple CryptoExercise

https://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_h.html

Điều này sẽ giúp bạn có được DER mã hóa dữ liệu nhị phân. Sau đó, sử dụng phương pháp sau đây để tải nó vào M2Crypto bằng Python: (Về cơ bản, chỉ cần base64 nó và gọi một phương thức.)

https://stackoverflow.com/a/5765576/584616

Tôi có một phiên bản của ARC getPublicKeyBits phương pháp này được kích hoạt, nhưng tôi đã không nhận xung quanh để đăng nó được nêu ra.

Cập nhật - vào đọc lại câu hỏi của bạn, câu trả lời thực sự là ở đây:

How to find out the modulus and exponent of RSA Public Key on iPhone/Objective C

Bạn có thể sử dụng điều này để có được những mô đun và số mũ như NSData, mà bạn sẽ có thể dễ dàng chuyển đổi thành base64 hoặc đại diện của bạn lựa chọn.

0

Triển khai cơ bản của M2Crypto là OpenSSL. OpenSSL sẽ không nhập khóa công khai thuần túy của bạn khi bạn xuất nó nhưng chỉ khi nó được "nhúng" trong một chứng chỉ có thể tự ký. Kiểm tra cách tạo chứng chỉ tự ký với khung công tác Crypto hoặc Bảo mật chung, nhúng khoá công khai của bạn và ký tên bằng khóa riêng của bạn, trích xuất dữ liệu của nó và gửi nó đến máy chủ của bạn: nó sẽ hoạt động.

Xem thêm openssl_pkey_get_public not open public key, "no start line" error (câu trả lời thứ hai)

+0

Ý của bạn là "trích xuất dữ liệu của nó"? – brennen

+0

Điều tương tự như bạn đã sử dụng cho khóa riêng của mình: một khi bạn có chứng chỉ trong bộ nhớ, hãy sao chép dữ liệu nhị phân vào NSData và gửi luồng byte tới máy chủ. – MrTJ

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