2011-06-30 9 views
3

J'essaie de crypter une clé AES avec une clé publique RSA et une application Android, puis décrypter la clé AES sur un serveur en utilisant PHP avec phpseclib. J'ai testé pour m'assurer que le cryptage/décryptage RSA fonctionne sur les deux plates-formes en cryptant un texte statique et en le décryptant ensuite pour vérifier si je reçois toujours le texte original. Selon le test, le code RSA fonctionne individuellement sur chaque plate-forme, mais il semble y avoir une différence entre les plates-formes.Cryptage RSA en Java, décryptage en PHP

En Java, j'utilise la bibliothèque Bouncy Castle et ai le code suivant:

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(
new BigInteger("00c897f9e401819e223ffbecc6f715a8d84dce9022762e0e2d54fa434787fcaf230d28bd0c3b6b39b5211f74ffc4871c421362ccfc07ae98b88fa9728f1e26b8210ebbf4981e45867fe810938294d0095d341b646b86dcbd4c246676c203cb1584d01eef0635299714d94fa12933ecd35e6c412573156d9e6e549b7804eb6e165660507d8748bcc8c60da10099bacb94d3f7b50b1883ee108489e0dd97ed7d28e564edd4ee5d6b4225f5c23cdaaf495c3fa08c3b82e1674946e4fa1e79b2493204d6953c261105ba5d0f8dcf3fcd39a51fbc18a5f58ffff169b1bed7ceeded2ae0e8e8e2238e8b77b324d1a482593b1a642e688c860e90d5a3de8515caf384133b", 16), 
new BigInteger("11", 16)); 
keyFactory = KeyFactory.getInstance("RSA", "BC"); 
//RSAPublicKeySpec rsaKeySpec = new RSAPublicKeySpec(rsaKey.MODULUS, new BigInteger("11", 16)); 
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(pubKeySpec); 

//Set up the cipher to RSA encryption 
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC"); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

// make sure the Aes Key is less than a block size 
// otherwise major errors will occur 
if(AesKey.length * 8 > pubKey.getModulus().bitLength()) 
    return "Error: AesKey bigger than block size of RSA Key"; 

byte[] encryptedKey = cipher.doFinal(AesKey); 

// return result Base64 encoded 
return Base64.encodeToString(encryptedKey, Base64.DEFAULT); 

Ensuite, dans le PHP, je suis en utilisant le code suivant pour déchiffrer la clé AES:

$AESkey = base64_decode($AES); 

$rsa = new Crypt_RSA(); 
$private = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/PrivateData/private_key.pem'); 
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); 
$rsa->loadKey($private); 
$AESkey = $rsa->decrypt($AESkey); 

Lorsque la clé AES est décryptée par le serveur, j'obtiens toujours l'erreur suivante: Erreur de déchiffrement dans C: \ xampp \ php \ PEAR \ phpseclib \ Crypt \ RSA.php sur la ligne 1911. Regarder le code dans RSA.php , Je pense que l'erreur a quelque chose à voir avec un remplissage incorrect pendant le cryptage, mais je ne peux pas sembler comprendre un façon de le réparer.

Mise à jour: J'ai compris que le code de chiffrement/déchiffrement ci-dessus est correct. Le problème que je rencontrais était que je n'encodais pas la sortie avant d'envoyer les données de l'application vers le php, ce qui a entraîné la perte de certaines informations.

+0

L'erreur signifie l'un des deux premiers octets d'ordre élevé est mauvais, et indique généralement une erreur très grave, comme la clé privée est incorrecte. Peut-il y avoir un problème d'endianisme? C'est une autre chose que je vérifierais. –

+0

Comment pourrais-je vérifier cela? J'ai l'impression qu'il n'y a rien de mal avec les clés car je peux le faire fonctionner si je fais le cryptage et le décryptage en PHP mais je pense que cela peut poser un problème avec la façon dont je saisis la clé publique en Java ou le schéma de remplissage que j'utilise en Java. – UmangB

+0

Une façon de vérifier est d'inverser les octets de chiffrement et de voir si le décryptage réussit. Mais le meilleur moyen est de trouver quelques bons vecteurs de test connus et de voir comment ils sont traités par le côté PHP. Il serait également utile si vous pouviez définir des points d'arrêt dans le phpseclib pour examiner les valeurs intermédiaires. –

Répondre

0

Quelle version de phpseclib utilisez-vous? Selon la version qui suit peut vous aider:

http://www.frostjedi.com/phpbb/viewtopic.php?p=118414#p118414

+0

J'ai la version la plus à jour qui comprend le correctif discuté dans le lien. Après avoir fait d'autres tests, j'ai déterminé que cela peut être un problème avec les différents jeux de caractères utilisés par Java et PHP. Java utilise UTF-8 par défaut et PHP utilise ISO-8859-1 par défaut. Je ne suis pas sûr comment convertir entre les deux sans perdre aucune des données. Je ne peux pas non plus comprendre comment faire php base 64 décoder les chaînes utf-8. – UmangB

+0

Que faire si vous n'avez pas généré le mot de passe en tant que chaîne en Java mais plutôt en tant que ByteArray ou quelque chose? –

+0

effectivement, après avoir fait un tas de tests et de débogage pour trouver une solution, j'ai découvert que le cryptage est correct mais les informations envoyées entre l'application android et php doivent être encodées url après avoir été codé en base 64 ou bien les données se foiré. – UmangB

Questions connexes