Cryptage RSA: différence entre Java et Android

j'utilise RSA pour crypter le nom d'utilisateur et le mot de passe sur Android et les décrypter sur le serveur (tomcat 6, java 1.6). Cryptage Android:

    PublicKey pubKey = readPublicKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

Java Tomcat Decryption:

    PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, pubKey);
    byte[] cipherData = cipher.doFinal(data);
    return cipherData;

si j'utilise la partie android en dehors d'android (juste dans une méthode principale) cela fonctionne très bien. Mais pas à l'intérieur de mon android (émulateur). Du côté de de server, j'obtiens l'erreur suivante:

javax.crypto.BadPaddingException: Blocktype mismatch: 0
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

je garde les constantes mod et ex comme bigintegers pour ne pas les écrire dans un fichier. Je sais qu'il y a une différence entre java1.6 et Java 1.5 cryptage, donc les deux sont compilés avec java 1.6.

Quelques informations de débogage:

pendant le débogage dans android je peux voir que pubKey contient le module et l'exposant dans hexadécimal. Et si je debug dans une méthode principale (encore le même code) je peux voir que pubKey contient le module et l'exposant en décimal.

Qu'est-ce que je fais de mal?

Merci

26
demandé sur bsobat 2011-05-20 12:33:18

3 réponses

je fais le cryptage RSA dans Android 2.2+ et le décryptage sur un serveur tomcat 6 java 1.6.

j'ai eu ce problème précis, lisant partout et en partie grâce à la réponse de @Femi je suis tombé sur ce dont j'avais besoin.

la solution était d'utiliser la spécification de l'algorithme suivant pour le chiffrement:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

cela fonctionne faire le cryptage à partir des smartphones Android et BlackBerry. Je sais que cela fait quatre mois que la question a été posée, mais juste en cas où quelqu'un d'autre passe par ce problème.

42
répondu blindstuff 2017-01-29 21:32:56

je vous suggère d'utiliser l'initialisation de chiffrement spécifique: comme exemple,

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

va travailler sur les deux. L'exception que vous obtenez (BadPaddingException) se produit parce que le capitonnage d'initialisation de chiffrement par défaut semble être différent entre le JVM de bureau et le JVM Android.

11
répondu Femi 2011-05-23 08:32:44

Premièrement, on dirait que vous initialisez les deux chiffrements avec la clé publique. Le chiffrement utilise la clé publique, le déchiffrement utilise la clé privée. J'espère que c'est juste une faute de frappe.

j'ai eu beaucoup de problèmes avec le cryptage RSA ainsi, beaucoup était d'essai et d'erreur. Je vous suggère d'essayer un autre fournisseur. J'ai réussi à implémenter RSA avec BouncyCastle.

Cipher wrapper = Cipher.getInstance("RSA", "BC");
wrapper.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedData= wrapper.doFinal(unencryptedData);

bien que, j'ai créé mon propre clavier puisque c'était un cryptage de session.

kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(1024);
        KeyPair kp = kpg.genKeyPair();
        publicKey = kp.getPublic();
        privateKey = kp.getPrivate();
1
répondu Jeremy Jem Lee 2011-05-23 08:15:52