Java y .NET interop en firmas (RSA)

Estoy firmando algunos datos en una tarjeta inteligente basada en .net e intentando verificar esa firma en un entorno Java, pero sin éxito.

Tarjeta inteligente (c #):

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024); // In a different method, rsaParams.Exponent and rsaParams.Modulus are set rsaProvider.ImportParameters(rsaParams); // Here I'm importing the key SHA1 sha1 = SHA1.Create(); byte[] signature = rsaProvider.SignData(data, sha1); 

Cliente (Java):

 Signature sig = Signature.getInstance("SHA1withRSA"); sig.initVerify(rsaPublicKey); // initiate the signature with public key sig.update(data); // update signature with the data that was signed by the card sig.verify(signedData); // Test card signature - this always returns false 

Luego intenté crear la firma en el cliente de Java (para pruebas), y resulta que la firma creada en el cliente de Java es diferente de la creada en la tarjeta inteligente. Lo creé así:

 Signature sig = Signature.getInstance("SHA1withRSA"); sig.initSign(rsaPrivateKey); sig.update(data); locallySigned = sig.sign(); 

Ahora entiendo que la firma es algo así como el hash de (datos pasados ​​+ el algoritmo usado). ¿Es posible que las implementaciones no sean compatibles aquí? ¿Me estoy perdiendo algo más? ¡Gracias!

PS: Sí, verifiqué que tanto la entrada como la salida se transfirieron correctamente desde / a la tarjeta, que los parámetros clave están establecidos y que la entrada / salida son exactamente iguales.

Edición: Generación de claves en Java:

 // Create a key-pair and install the private key on the card KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random); KeyPair keyPair = keyGen.genKeyPair(); privateKey = (RSAPrivateKey)keyPair.getPrivate(); publicKey = (RSAPublicKey)keyPair.getPublic(); 

y luego estoy configurando exp y mod de la clave privada en la tarjeta.

// En un método diferente, rsaParams.Exponent y rsaParams.Modulus están configurados

Para establecer el exponente privado en una clave RSA, debe usar RSAParameters.D . RSAParameters.Exponent es para el exponente público .