2009-10-21 4 views
4

Je signe des données sur une carte à puce .net et j'essaie de vérifier cette signature dans un environnement java - mais sans succès.Signature Java et .NET interop on (RSA)

Smartcard (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); 

client (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 

J'ai alors essayé de créer la signature sur le client Java (pour les tests) - et Il s'avère que la signature créée sur le client Java est différente de celle créée sur la carte à puce. Je l'ai créé comme ceci:

Signature sig = Signature.getInstance("SHA1withRSA"); 
sig.initSign(rsaPrivateKey); 

sig.update(data); 
locallySigned = sig.sign(); 

Je comprends maintenant que la signature est quelque chose comme le hachage (données transmises + l'algorithme utilisé). Est-il possible que les implémentations ne soient pas compatibles ici? Est-ce que je manque quelque chose d'autre? Merci! PS: Oui, j'ai vérifié que l'entrée et la sortie sont transférées correctement de/vers la carte, que les paramètres clés sont réglés et que les entrées/sorties sont exactement les mêmes.

Edit: génération de clés 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(); 

et je suis mise en exp et mod de la clé privée sur la carte.

+0

En Java, comment générez-vous la clé publique RSA? – Kevin

+0

ajouté le code de génération de clé – wilth

Répondre

3

// Dans une autre méthode, rsaParams.Exponent et rsaParams.Modulus sont mis

Pour définir l'exposant privé dans une clé RSA, vous devez utiliser RSAParameters.D. RSAParameters.Exponent est pour le public exposant.

+0

Wow, êtes-vous sérieux? Cela l'expliquerait ;-) En l'essayant (en paramétrant Modulus et D), j'obtiens une Exception Cryptographique lors de l'importation - selon le document, je pourrais manquer certains paramètres dans le RSAParameters. Quelqu'un sait lesquels sont requis? – wilth

+1

Il attend aussi l'exposant public - une fois que cela est configuré, cela fonctionne. Merci beaucoup pour l'indice! – wilth