iphone - seguridad - En ios 3des el cifrado contiene muchas terminaciones nulas. Cuando convierto NSData en NSString, ¿terminará en la primera terminación nula?
recuperar contraseña encriptar copia seguridad iphone (1)
La conversión de NSData
a NSString
no se detiene en bytes nulos. Un NSString
puede contener caracteres Unicode arbitrarios, incluidos los caracteres incrustados "NULL".
Ejemplo:
char bytes[] = { ''H'', ''e'', ''l'', ''l'', ''o'', 0, ''W'', ''o'', ''r'', ''l'', ''d'', 0 };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);
Salida:
Hello
Por lo tanto, parece que la cadena contiene solo 5 caracteres y la conversión se detuvo en el primer byte nulo. Pero eso es solo la salida NSLog
, de hecho, nada se pierde:
for (int i = 0; i < [str length]; i++) {
unichar c = [str characterAtIndex:i];
NSLog(@"%2d, %3d, %c", i, c, c);
}
Salida:
0, 72, H
1, 101, e
2, 108, l
3, 108, l
4, 111, o
5, 0,
6, 87, W
7, 111, o
8, 114, r
9, 108, l
10, 100, d
11, 0,
Entonces la cadena contiene todos los datos y no se pierde nada. Probablemente, la cadena se trunca más tarde, cuando la envía al servidor.
OBSERVACIÓN: La conversión de los datos cifrados a una cadena me parece problemática, porque los datos se interpretan en algunas codificaciones de caracteres. He elegido NSASCIIStringEncoding
en este ejemplo, pero según la documentación, esta codificación solo es válida para los valores ASCII 0 ... 127.
Si agrega más información sobre cómo y en qué formato se envían los datos cifrados al servidor, es posible que podamos hacer sugerencias sobre cómo resolverlo mejor.
he usado esta función para el cifrado 3des.
ccStatus = CCCrypt(kCCEncrypt, // CCoperation op
kCCAlgorithm3DES, // CCAlgorithm alg
kCCOptionPKCS7Padding, // kCCOptionPKCS7Padding, //kCCModeECB, // CCOptions
[_keyData bytes], // const void *key
kCCKeySize3DES, // 3DES key size length 24 bit
vinitVec, //iv, // const void *iv,
[dTextIn bytes], // const void *dataIn
[dTextIn length], // size_t dataInLength
bufferPtr, // void *dataOut
bufferPtrSize, // size_t dataOutAvailable
&movedBytes); // size_t *dataOutMoved
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];''
Aunque está funcionando. pero cuando convierto convierte este NSData a NSString, porque el NSString contiene mucha terminación nula, NSString termina en la primera terminación nula, la variable no puede contener la información completa. pero tengo que enviar cadena cifrada en el servidor. ¿Qué puedo hacer para convertir NSData en NSString? cadena que contiene todos los medios de datos (si los datos contienen terminación nula, la cadena no terminará en ese caso)?
Por favor, ayuda Gracias de antemano.
gracias por responder, mira si el byte encriptado contiene
char bytes[] = { ''H'', ''e'', ''l'', ''l'', ''o'', /0, ''W'', ''o'', ''r'', ''l'', ''d'', /0 };
NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"%@", str);
NSString *sendtoserver=[NSString stringwithformat:@"<request>%@</request>",str];
cuando convertimos estos NSData a NSString. terminará primero / 0 (terminación nula) porque tenemos que enviar NSString encriptado.so que está causando problemas. y no puedo enviar la base64string porque el lado del servidor no quiere eso. Ellos estaban pidiendo una cadena de encriptación.
Entonces, ¿qué hago ahora, por favor ayuda y gracias de nuevo por la respuesta señor,