#iphone #ios #security #rsa
#iPhone #iOS #Безопасность #rsa
Вопрос:
Я хотел бы расшифровать большой двоичный объект, закодированный в 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 (ключ) иначе, чем путем генерации пары или импорта сертификата, которого у меня нет / который мне не нужен.
Есть ли способ вручную создать ключ с модулем показатель? Если да, можете ли вы подсказать мне, как это сделать?
Заранее спасибо
Комментарии:
1. У меня такие же проблемы. Можете ли вы помочь мне в том же, если у вас есть какой-нибудь пример кода / ссылка, пожалуйста, помогите мне.
Ответ №1:
Как закодированы ваши экспонента и модуль? Если они находятся в большом двоичном объекте PKCS # 12, вы можете использовать SecPKCS12Import()
и SecIdentityCopyPrivateKey()
для достижения желаемого.
РЕДАКТИРОВАТЬ: Учитывая, что у вас есть исходные ключи, вам может быть интересно взглянуть на -[SecKeyWrapper addPeerPublicKey:keyBits:]
пример, предоставленный Apple.
Комментарии:
1. Спасибо. Мои экспонента и модуль не закодированы, они просто большие целые числа, хранящиеся в памяти либо в виде большого, либо в виде младшего порядкового номера.
2. Спасибо, этот пример кажется приятным, но я не могу найти никакой документации по ожидаемому формату для импорта ключа (это просто неясный набор из 592 бит); как кодируется показатель степени, после или до модуля и т.д. Есть ли какая-либо документация по этому поводу?
3. Блог. wingsofhermes.org/?p=42 и блог. wingsofhermes.org/?p=75 Может использоваться для обмена
4. @SedateAlien Я все еще немного в замешательстве. В моем случае это открытый ключ, а показатель степени и модуль представлены в такой форме:
<RSAKeyValue><Modulus>yOTe0L1/NCbXDZYdlis82MiTe8VD5WD23S4RDsebJOFzCLbsyb4d K1M5FB xPfCkji1zQjPijiToZ7JSj/2ww==</Modulus><Exponent>AWAB</Exponent></RSAKeyValue>
Как мне получить из этого открытый ключ?5. @pixelfreak .. вы получили ответ на свой запрос?
Ответ №2:
У меня есть библиотека, которая позволяет создавать двоичные данные для импорта ключей RSA в modulus и exponent прямо сейчас:
https://github.com/StCredZero/SCZ-BasicEncodingRules-iOS
SCZ-BasicEncodingRules-iOS
Реализация основных правил кодирования, позволяющих импортировать ключи RSA в связку ключей iOS с использованием exponent. Код нацелен на 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 *)amp;persistPeer);
Комментарии:
1. Я попробовал
berData
, полученный открытый ключ отличается от того, что я получил с помощью . Сетевая реализация. Вы уверены, что это работает?2. Я успешно использовал его. Не могли бы вы предоставить больше контекстной информации?
3. У меня есть.. экспонента и модуль в виде строки от пользователя Android, нужно ли мне использовать: dataUsingEncoding:NSUTF8StringEncoding для получения pubKeyModData и pubKeyModData?