2011-05-09 18 views
12

Me gustaría descifrar un blob codificado en RSA en iPhone, teniendo un exponente y módulo como clave privada. En Java (con javax.crypto), esto podría lograrse fácilmente mediante código como este:iOS - Creando SecKeyRef desde exponente + módulo

// 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 

Pero con la API de seguridad iPhone no puedo crear un SecKeyRef (clave) que no sea mediante la generación de un par o importar un certificado, que no tengo/quiero.

¿Hay alguna forma de crear una clave manualmente con un módulo + exponente? Si es así, ¿puedes darme una pista sobre cómo?

Gracias de antemano

+1

Tengo los mismos problemas. ¿Puede guiarme por lo mismo, si tiene algún código de muestra/enlace por favor ayúdenme? –

Respuesta

1

la codificación de los exponentes y el módulo? Si están en un blob PKCS#12, puede usar SecPKCS12Import() y SecIdentityCopyPrivateKey() para lograr lo que desea.

EDITAR: Teniendo en cuenta que usted tiene las llaves en bruto, que podría estar interesado en ver el ejemplo -[SecKeyWrapper addPeerPublicKey:keyBits:]provided por Apple.

+0

Gracias. Mi exponente y módulo no están codificados, solo son enteros grandes almacenados en la memoria como grande o pequeño endian. – Hashi

+0

@Hashi: He actualizado mi respuesta ahora. –

+0

Gracias, este ejemplo parece agradable, pero no encuentro ninguna documentación sobre el formato esperado para importar la clave (es solo un oscuro conjunto de 592 bits); cómo se codifica el exponente, es después o antes del módulo, etc. ¿Hay alguna documentación sobre eso? – Hashi

1

que tienen una biblioteca que te permite crear los datos binarios para importar claves RSA en el módulo y el exponente ahora:

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

SCZ-BasicEncodingRules-IOS

aplicación de las normas básicas de codificación para permitir importación de claves RSA a iOS KeyChain using exponente. El código se dirige a iOS 5 con ARC.

Digamos que ya tiene un módulo y un exponente de una clave pública RSA como un NSData en las variables llamadas pubKeyModData y pubKeyExpData. A continuación, el siguiente código creará un NSData que contiene esa clave pública RSA , que luego puede insertar en el llavero iOS o OS X.

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

Esto permitirá almacenar la clave utilizando la addPeerPublicKey: keyBits: Método de SecKeyWrapper en el ejemplo de Apple CryptoExercise. O, desde la perspectiva de la API de bajo nivel, puede usar 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); 
+0

Intenté 'berData', la clave pública resultante es diferente de la que obtuve con la implementación de .NET. ¿Estás seguro de que esto funciona? – pixelfreak

+0

Lo he usado con éxito. ¿Podría dar más información contextual? – StCredZero

+0

Tengo ... exponente y módulo como cadena de un chico androide, ¿necesito usar: dataUsingEncoding: NSUTF8StringEncoding para obtener pubKeyModData y pubKeyModData? – Devarshi

Cuestiones relacionadas