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.
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. –
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
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. –