2017-04-06 3 views
4

Cela peut être un doublon de this answered question, mais je n'arrive pas à obtenir les mêmes résultats. Espérant quelques conseils ici.Chiffrement RSA à l'aide de JSEncrypt et décryptage à l'aide de BouncyCastle (Java)

JSEncrypt (client)

let encrypt = new Encrypt.JSEncrypt(); 
encrypt.setPublicKey(this.publicKey); // retrieved from server 
encrypt.encrypt(password); 

BouncyCastle (serveur) - génération de la clé RSA

KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); 
generator.initialize(1024); 
KeyPair pair = generator.generateKeyPair(); 
PublicKey pubKey = pair.getPublic(); 
PrivateKey privKey = pair.getPrivate(); 

// returned to client 
String publicKeyStr = new String(Base64.encodeBase64(pubKey.getEncoded())); 
String privateKeyStr = new String(Base64.encodeBase64(privKey.getEncoded())); 

BouncyCastle (serveur) - Decryption

Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); 
cipher.init(Cipher.DECRYPT_MODE, privateKey); 
// org.apache.commons.codec.binary.Hex 

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 
decrypted = new String(cipherText, BaseConstant.ENC_UTF8); 

erreur

org.apache.commons.codec.DecoderException: Caractère hexadécimal illégal I à l'index 0 à org.apache.commons.codec.binary.Hex.toDigit (Hex.java:178) à org.apache.commons.codec .binary.Hex.decodeHex (Hex.java:89)

Une chose que je remarque est la longueur du texte crypté par JSEncrypt, qui est de 172, alors que le chiffrement à côté serveur produit 256.

la réponse question mentionnée pour utiliser RSA/None/PKCS1Padding, que j'avais déjà défini. Quoi d'autre pourrais-je manquer?

+0

L'exception n'est pas liée au déchiffrement. L'exception est levée par Hex.decodeHex() – Egl

+1

Merci, mais la solution fournie par @Hugo était sur place – acys

Répondre

2

L'erreur se produit dans la méthode Hex.decodeHex(), ce qui signifie que vos données ne sont pas une chaîne codée Hex.

JSEncrypt.encrypt() La méthode retourne les données cryptées en Base64 (au lieu de la chaîne hexadécimale). Afin de le décrypter, vous devez le décoder à partir du format base64.

Ainsi, au lieu de:

byte[] cipherText = cipher.doFinal(Hex.decodeHex(encrypted.toCharArray())); 

Faites ceci:

byte[] cipherText = cipher.doFinal(Base64.decodeBase64(encrypted.toCharArray())); 
+0

Super! Cela marche! – acys

+1

Super! Si cela a fonctionné et vous l'avez trouvé utile, vous pouvez upvote et/ou accepter la réponse (ce n'est pas obligatoire, bien qu'une bonne pratique) –

+1

J'ai essayé upvoting, mais il dit que je n'ai pas assez de points de réputation :( – acys