2015-10-25 1 views
0

La méthode suivante ne fonctionne pas. decodedMessage se termine avec des déchets à la place des résultats attendus.Essayer de faire fonctionner le cryptage RSA asymétrique

Je suis un exemple here qui fonctionne supposément.

public static void POCSimple() 
{ 
    String secretMessage = "short message"; 
    PublicKey publicKey = null; 
    PrivateKey privateKey = null; 
    String encodedMessage = ""; 
    byte[] encodedBytes = null; 
    String decodedMessage =""; 
    byte[] decodedBytes = null; 


    try 
    { 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair kp = kpg.genKeyPair(); 
     publicKey = kp.getPublic(); 
     privateKey = kp.getPrivate(); 

     Cipher c1 = Cipher.getInstance("RSA"); 
     c1.init(Cipher.ENCRYPT_MODE, publicKey); 
     encodedBytes = c1.doFinal(secretMessage.getBytes()); 
     encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT); 

     Cipher c2 = Cipher.getInstance("RSA"); 
     c2.init(Cipher.DECRYPT_MODE, privateKey); 
     decodedBytes = c2.doFinal(encodedBytes); 
     decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT); 

     String mystring = "look at results"; 

    } 
    catch (Exception e) 
    { 
     String status = e.toString(); 
    } 


} 

Toute aide serait grandement appréciée. Merci, Dean

+1

Le code semble correct. Êtes-vous sûr de recevoir des ordures? 'decodedMessage' devrait être la version codée en Base64 du message secret. Avez-vous un exemple? – Thilo

Répondre

1

Il se trouve que dans mon code d'origine, decodedBytes contenait le bien octets décryptés. La commande suivante tournait decodedBytes en caractères junk ...

decodedMessage = Base64.encodeToString(decodedBytes, Base64.DEFAULT); 

J'ai remplacé ce code avec ...

String str = new String(decodedBytes, "UTF-8"); 

Et cela résolu le problème probablement parce que decodedBytes avait jamais été Base64 dans le premier endroit.

J'ai également trouvé que l'utilisation de RSA I ne peut crypter un maximum de 245 octets que si j'utilise une clé de 2048 bits. moins si j'utilise une clé de 1024 bits. Si des chaînes plus grandes doivent être cryptées en utilisant des clés publiques/privées asymétriques, je dois d'abord chiffrer une chaîne en utilisant AES symétrique, puis crypter la clé AES avec la clé publique RSA et envoyer la clé AES cryptée et le message crypté sur le fil où le récepteur peut décrypter la clé AES en utilisant leur clé privée RSA. La clé AES peut être générée de manière aléatoire dans le code d'envoi.

+0

Je n'appellerais pas la bêtise Base64, mais bon de voir que vous avez résolu le problème et appris quelque chose le long du chemin. – Thilo

1

Bien sûr, vous obtenez des ordures, c'est votre séquence:

Plaintext message -> Encrypt -> Encode -> Encoded message 

Encoded message -> Decrypt -> Decode -> GARBAGE 

Vous devez annuler l'encodage base64 avant de pouvoir déchiffrer le message, vous faites le processus inverse dans la commande incorrecte!

Modifier

En fait, son pire, ceci est votre séquence:

Plaintext message -> Encrypt -> Encode -> Encoded message 

Encrypted message -> Decrypt -> Encode -> GARBAGE 

Essayez ceci:

Cipher c1 = Cipher.getInstance("RSA"); 
c1.init(Cipher.ENCRYPT_MODE, publicKey); 
encodedBytes = c1.doFinal(secretMessage.getBytes()); 
encodedMessage = Base64.encodeToString(encodedBytes, Base64.DEFAULT); 

Cipher c2 = Cipher.getInstance("RSA");  
c2.init(Cipher.DECRYPT_MODE, privateKey)  
decodedBytes = Base64.decode(encodedMessage.toByteArray(), Base64.DEFAULT); 
decryptedMessage = c2.doFinal(decodedBytes); 
+0

"Vous devez annuler l'encodage Base64 avant de pouvoir déchiffrer le message" Le code en question n'essaie pas de déchiffrer la version Base64. Il travaille directement sur les octets cryptés. Les valeurs Base64 ne sont pas du tout utilisées, probablement pour l'affichage ou le débogage. Le code devrait fonctionner comme présenté. – Thilo

+0

L'utilisation des mots "codé" et "décodé" par l'OP est incorrecte et maintenant que je le relis attentivement, je peux comprendre votre point de vue. Je ne vois toujours pas ce que la question demande. 'encodedMessage' est une chaîne cryptée RSA et Base64 tandis que' decodedMessage' est un texte en clair codé en Base64. Un certain contexte sur ce qui essaie d'être réalisé ici serait utile. – steve