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 (ключ), кроме как генерируя пару или импортируя сертификат, которого у меня нет /. >
Есть ли способ создать ключ вручную с модулем + экспонентой? Если да, можете ли вы дать мне понять, как?
Заранее спасибо
Ответы
Ответ 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);