iOS — Создание SecKeyRef из экспоненты модуль

#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?