He estado golpeando mi cabeza en una pared con este. Necesito codificar la aplicación de mi iPhone para cifrar un "pin" de 4 dígitos usando 3DES en modo ECB para la transmisión a un servicio web que creo que está escrito en .NET.Problema de longitud de clave de cifrado de iPhone 3DES
+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
bzero(keyBuffer, sizeof(keyBuffer)); // fill with zeroes (for padding)
[key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
size_t returnLength = ([encryptData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
// NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
char* returnBuffer = malloc(returnLength * sizeof(uint8_t));
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
keyBuffer, kCCKeySize3DES, nil,
[encryptData bytes], [encryptData length],
returnBuffer, returnLength,
&numBytesEncrypted);
if (ccStatus == kCCParamError) NSLog(@"PARAM ERROR");
else if (ccStatus == kCCBufferTooSmall) NSLog(@"BUFFER TOO SMALL");
else if (ccStatus == kCCMemoryFailure) NSLog(@"MEMORY FAILURE");
else if (ccStatus == kCCAlignmentError) NSLog(@"ALIGNMENT");
else if (ccStatus == kCCDecodeError) NSLog(@"DECODE ERROR");
else if (ccStatus == kCCUnimplemented) NSLog(@"UNIMPLEMENTED");
if(ccStatus == kCCSuccess) {
NSLog(@"TripleDESEncryptWithKey encrypted: %@", [NSData dataWithBytes:returnBuffer length:numBytesEncrypted]);
return [NSData dataWithBytes:returnBuffer length:numBytesEncrypted];
}
else
return nil;
} }
me pongo un valor cifrado usando el código anterior, sin embargo, no coincide con el valor del servicio .NET Web.
Creo que el problema es que la clave de encriptación que me han proporcionado los desarrolladores del servicio web es de 48 caracteres.
Veo que el SDK de iPhone constante "kCCKeySize3DES" es 24. Por lo tanto SOSPECHO, pero no sé, que la llamada de API commoncrypto solo utiliza los primeros 24 caracteres de la clave suministrada.
¿Es esto correcto?
¿Hay CUALQUIER forma en que pueda obtener esto para generar el pin correcto encriptado? He obtenido los bytes de datos del cifrado ANTES de la codificación base64 y he intentado hacer coincidir esto con los generados a partir del código .NET (con la ayuda de un desarrollador .NET que me envió la salida de matriz de bytes). Ni la matriz de bytes codificada no base64 ni las cadenas codificadas base64 final coinciden.
Gracias a Thomas por su respuesta detallada aquí. Los conceptos que mencionas son exactamente lo que terminé investigando con más detalle. Tuve suerte porque tenía acceso a la versión .NET del código de cifrado y eso me dio valiosos consejos. El PIN de 4 dígitos se convirtió en un valor de 8 dígitos para alimentar el algoritmo 3DES al agregar 4 0's. Agregué mi código a esta respuesta, pero marqué como la solución porque su conocimiento era totalmente correcto. –