restablecer - Cifrado RSA: descifrado en iphone
recuperar contraseƱa encriptar copia seguridad iphone (1)
Estoy desarrollando aplicaciones para Iphone. He utilizado el método SecKeyGeneratePair de Security / Security.h framework. Obtengo claves públicas y privadas como objetos SecKeyRef. ¿Puedo acceder a la clave o imprimir su valor a la consola? ¿Puedo obtener un objeto NSString o NSData de él? Cuando imprimo la clave de la consola usando NSLog, estoy obteniendo. ¿Podemos pasar estos objetos clave por la red a otra aplicación que pueda estar en Java? ¿Podemos cifrar algo de texto en la aplicación iphone, enviarlo al servidor, usando la clave que se envía para descifrar el texto en el lado del servidor?
Editado para agregar Gracias Alex Reynolds por su respuesta rápida. En el caso de la encriptación RSA, primero tengo que generar un par de claves que está en forma de objetos SecKeyRef. Luego pasaremos esa referencia a los métodos SecKeyEncrypt y SecKeyDecrypt. cuando encripto y descifro localmente, funciona perfectamente, pero si intento enviar la clave y los datos cifrados al servidor y descifrarlos en el servidor (implementación de Java), no puedo pasar el objeto SecKeyRef al servidor como valor clave. En java tenemos que obtener la cadena en formato de cadena o de matriz de bytes para pasar al método de encriptación. ¿Podemos obtener acceso a los datos almacenados en el objeto SecKeyRef (que es un objeto NSCFType)? que es una estructura __SecKey.
Considere usar NSData para obtener el valor de la cadena, y quizás use Base64 o alguna otra forma de codificación cuando pase por la red (y luego decodifique desde Base64 a lo que sea en Java).
Aquí hay un ejemplo de algún código que podría ayudarlo a comenzar. Estoy haciendo una firma HMAC-SHA1 (''digest'') aquí, pero la idea general es la misma para tu caso RSA:
#import <Foundation/NSString.h>
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonDigest.h>
@interface NSString (NSStringAdditions)
+ (NSString *) base64StringFromData:(NSData *)data length:(int)length;
- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey;
@end
-------------------------------------------
#import "NSStringAdditions.h"
static char base64EncodingTable[64] = {
''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''I'', ''J'', ''K'', ''L'', ''M'', ''N'', ''O'', ''P'',
''Q'', ''R'', ''S'', ''T'', ''U'', ''V'', ''W'', ''X'', ''Y'', ''Z'', ''a'', ''b'', ''c'', ''d'', ''e'', ''f'',
''g'', ''h'', ''i'', ''j'', ''k'', ''l'', ''m'', ''n'', ''o'', ''p'', ''q'', ''r'', ''s'', ''t'', ''u'', ''v'',
''w'', ''x'', ''y'', ''z'', ''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'', ''+'', ''/''
};
@implementation NSString (NSStringAdditions)
- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey {
unsigned char digest[CC_SHA1_DIGEST_LENGTH];
char *keyCharPtr = strdup([secretKey UTF8String]);
char *dataCharPtr = strdup([self UTF8String]);
CCHmacContext hctx;
CCHmacInit(&hctx, kCCHmacAlgSHA1, keyCharPtr, strlen(keyCharPtr));
CCHmacUpdate(&hctx, dataCharPtr, strlen(dataCharPtr));
CCHmacFinal(&hctx, digest);
NSData *encryptedStringData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
free(keyCharPtr);
free(dataCharPtr);
return [NSString base64StringFromData:encryptedStringData length:[encryptedStringData length]];
}
+ (NSString *) base64StringFromData: (NSData *)data length: (int)length {
unsigned long ixtext, lentext;
long ctremaining;
unsigned char input[3], output[4];
short i, charsonline = 0, ctcopy;
const unsigned char *raw;
NSMutableString *result;
lentext = [data length];
if (lentext < 1)
return @"";
result = [NSMutableString stringWithCapacity: lentext];
raw = [data bytes];
ixtext = 0;
while (true) {
ctremaining = lentext - ixtext;
if (ctremaining <= 0)
break;
for (i = 0; i < 3; i++) {
unsigned long ix = ixtext + i;
if (ix < lentext)
input[i] = raw[ix];
else
input[i] = 0;
}
output[0] = (input[0] & 0xFC) >> 2;
output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
output[3] = input[2] & 0x3F;
ctcopy = 4;
switch (ctremaining) {
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}
for (i = 0; i < ctcopy; i++)
[result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];
for (i = ctcopy; i < 4; i++)
[result appendString: @"="];
ixtext += 3;
charsonline += 4;
if ((length > 0) && (charsonline >= length))
charsonline = 0;
return result;
}
@end