Подтвердить что ты не робот

IOS - создание SecKeyRef из показателя экспоненты + модуль

Я хотел бы расшифровать закодированный RSA blob на 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 (ключ), кроме как генерируя пару или импортируя сертификат, которого у меня нет /. >

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

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

4b9b3361

Ответ 1

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

EDIT. Учитывая, что у вас есть необработанные ключи, вам может быть интересно посмотреть пример -[SecKeyWrapper addPeerPublicKey:keyBits:] при условии от Apple.

Ответ 2

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

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

ЗКН-BasicEncodingRules-ИСН

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

Скажем, у вас уже есть модуль и показатель из открытый ключ RSA как NSData в переменных с именем pubKeyModData и pubKeyExpData. Затем следующий код создаст NSData, содержащий этот RSA открытый ключ, который затем можно вставить в iOS или Keychain 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);