¿Cuál es la diferencia en javax.crypto PKCS1Padding RSA enc / dec y security iOS SecKeyEncrypt con el mismo tipo de relleno

Estoy intentando cifrar la key AES usando RSA (SecKeyEncrypt) con kSecPaddingPKCS1 en iOS, y luego descifrar la key usando el proveedor estándar de Java para el algorithm RSA (javax.crypto). Estoy recibiendo con éxito la key pública generada por la aplicación java, almacenándola en el llavero iOS y usándola para cifrar la key aes, pero cuando recibo en la aplicación java, estoy recibiendo una exception bien conocida javax.crypto.BadPaddingException: Los datos deben comenzar con cero El mismo código funciona cuando deshabilito relleno (a veces funciona). Entonces, ¿dónde está la diferencia entre el relleno usado en iOS y en el patforme de Java? ¿Puede alguien darme la respuesta? Estoy luchando con este problema por mucho time. Perdido la paciencia

El código fuente 1) generar key simétrica, 2) envolverla usando la key pública rsa de mi aplicación java. (Se crea la key pública desde el module y el exponente que son enviados al cliente por la aplicación java) 3) Prepara NSData: init con key cifrada, agrega estos datos encriptados, envía a la aplicación java. Entonces, la aplicación java toma los primeros 128 bytes (key aes cifrada) e intenta descifrarla y aquí se lanza una exception.

[tools generateSymmetricKey]; NSData* encryptedSymetricKey = [tools wrapSymmetricKey:[tools getSymmetricKeyBytes] keyRef:[tools getPeerPublicKeyRef]]; int option = kCCOptionPKCS7Padding; NSData* aesEncr = [tools doCipher:data key:[tools getSymmetricKeyBytes] context:kCCEncrypt padding:(CCOptions *)&option]; NSMutableData * result = [[NSMutableData alloc] initWithData:encryptedSymetricKey]; [result appendData:aesEncr]; 

y el método que se tomó prestado de CryptoExercise, que debería funcionar para mí:

 - (NSData *)wrapSymmetricKey:(NSData *)symmetricKey keyRef:(SecKeyRef)publicKey { OSStatus sanityCheck = noErr; size_t cipherBufferSize = 0; size_t keyBufferSize = 0; LOGGING_FACILITY( symmetricKey != nil, @"Symmetric key parameter is nil." ); LOGGING_FACILITY( publicKey != nil, @"Key parameter is nil." ); NSData * cipher = nil; uint8_t * cipherBuffer = NULL; // Calculate the buffer sizes. cipherBufferSize = SecKeyGetBlockSize(publicKey); keyBufferSize = [symmetricKey length]; if (kTypeOfWrapPadding == kSecPaddingNone) { LOGGING_FACILITY( keyBufferSize <= cipherBufferSize, @"Nonce integer is too large and falls outside multiplicative group." ); } else { LOGGING_FACILITY( keyBufferSize <= (cipherBufferSize - 11), @"Nonce integer is too large and falls outside multiplicative group." ); } // Allocate some buffer space. I don't trust calloc. cipherBuffer = malloc( cipherBufferSize * sizeof(uint8_t) ); memset((void *)cipherBuffer, 0x0, cipherBufferSize); // Encrypt using the public key. sanityCheck = SecKeyEncrypt( publicKey, kSecPaddingPKCS1, (const uint8_t *)[symmetricKey bytes], keyBufferSize, cipherBuffer, &cipherBufferSize ); LOGGING_FACILITY1( sanityCheck == noErr, @"Error encrypting, OSStatus == %d.", sanityCheck ); // Build up cipher text blob. cipher = [NSData dataWithBytes:(const void *)cipherBuffer length:(NSUInteger)cipherBufferSize]; if (cipherBuffer) free(cipherBuffer); return cipher; 

}

Una cosa más. En el lado de Java estoy usando la instancia de encryption RSA / ECB / PKCS1Padding.

CÓMO TRANSMITIR LA CLAVE PÚBLICA: la key pública generada por Java desacoplada al module y al exponente, los dos valores se convierten a matrices de bytes sin formatting y se envían, luego se reproducen en el lado del cliente ios, se convierten al formatting compatible con el keyring de ios y se insertan en el llavero La key pública se transmite correctamente, he comparado tanto el module como los exponentes públicos en ambos lados y coinciden. la key pública se ha importado satisfactoriamente en el keyring en ios (esto lo logran las categorías BasicEncodingRules BER). Creo que debe haber algo mal con el soporte de relleno de PKCS1 padding: debe diferir en ambas plataforms (tal vez la computación relacionada con el relleno necesita algo adicional en iOS).