iOS - Создание SecKeyRef из экспоненты + модуля - PullRequest
12 голосов
/ 10 мая 2011

Я бы хотел расшифровать RSA-кодированный блоб на iPhone, указав экспоненту и модуль в качестве закрытого ключа.В Java (с javax.crypto) это может быть легко достигнуто с помощью такого кода:

// 1) key
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(myModulus, myPublicExponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
Key pubKey = fact.generatePublic(keySpec);

// 2) cypher
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec);

// 3) use cypher to decode my block to an output stream

Но с помощью API безопасности iPhone я не могу создать SecKeyRef (ключ), кроме как путем создания парыили импортировать сертификат, которого у меня нет / хочу.

Есть ли способ создать ключ вручную, имеющий модуль + показатель степени?Если да, можете ли вы дать мне понять, как?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 18 мая 2012

У меня есть библиотека, которая позволяет вам создавать двоичные данные для импорта ключей RSA по модулю и показателю теперь:

https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS

ЗКН-BasicEncodingRules КСН

Реализация базовых правил кодирования для включения импорта ключей RSA в iOS KeyChain с использованием показателя степени. Код ориентирован на iOS 5 с ARC.

Допустим, у вас уже есть модуль и показатель степени открытый ключ RSA как NSData в переменных с именем pubKeyModData и pubKeyExpData. Затем следующий код создаст NSData, содержащий этот RSA открытый ключ, который затем можно вставить в связку ключей iOS или OS X.

NSMutableArray *testArray = [[NSMutableArray alloc] init];
[testArray addObject:pubKeyModData];
[testArray addObject:pubKeyExpData];
NSData *testPubKey = [testArray berData];

Это позволит вам сохранить ключ, используя addPeerPublicKey: keyBits: метод из SecKeyWrapper в примере Apple CryptoExercise. Или, с точки зрения низкоуровневого API, вы можете использовать SecItemAdd ().

NSString * peerName = @"Test Public Key";

NSData * peerTag = 
   [[NSData alloc] 
       initWithBytes:(const void *)[peerName UTF8String] 
       length:[peerName length]];

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

[peerPublicKeyAttr 
   setObject:(__bridge id)kSecClassKey 
   forKey:(__bridge id)kSecClass];
[peerPublicKeyAttr 
   setObject:(__bridge id)kSecAttrKeyTypeRSA 
   forKey:(__bridge id)kSecAttrKeyType];
[peerPublicKeyAttr 
   setObject:peerTag 
   forKey:(__bridge id)kSecAttrApplicationTag];
[peerPublicKeyAttr 
   setObject:testPubKey 
   forKey:(__bridge id)kSecValueData];
[peerPublicKeyAttr 
   setObject:[NSNumber numberWithBool:YES] 
   forKey:(__bridge id)kSecReturnPersistentRef];

sanityCheck = SecItemAdd((__bridge CFDictionaryRef) peerPublicKeyAttr, (CFTypeRef *)&persistPeer);
1 голос
/ 10 мая 2011

Как кодируются ваши экспонента и модуль? Если они находятся в BLOB-объекте PKCS # 12 , вы можете использовать SecPKCS12Import() и SecIdentityCopyPrivateKey() для достижения желаемого.

РЕДАКТИРОВАТЬ : Учитывая, что у вас есть необработанные ключи, вам может быть интересно посмотреть -[SecKeyWrapper addPeerPublicKey:keyBits:] пример , предоставленный Apple.

...