Chiffrer un String avec RSA

Chiffrer un String avec RSA - Java - Programmation

Marsh Posté le 23-04-2007 à 21:17:04    

Bonsoir  :hello:  
 
Alors voila, j'ai un petit soucis :
 
j'ai fais pas mal de recherches mais je n'ai toujours pas trouvé de solution à mon problème :o :  
 
Je voudrais chiffrer un String à l'aide du RSA.
 
J'ai fait comme ça, en gros, pour obtenir une pair de clés privé/publique :  
 

Code :
  1. KeyPairGenerator pairCle;
  2. pairCle = KeyPairGenerator.getInstance("RSA" );
  3. this.clefPublique = pair.getPublic();
  4. this.clefPrivee = pair.getPrivate();


 
J'ai donc une clé publique en ma possession, et j'aimerais chiffrer un String avec, de maniere simple.
(en gros, quelque chose qui fait un truc du style :

Citation :

2. Chiffrement
 
Bob veut donc envoyer un message à Alice. Il cherche dans l'annuaire la clef de chiffrement qu'elle a publiée. Il sait maintenant qu'il doit utiliser le système RSA avec les deux entiers n et e (prenons par exemple n=5141=53·97 et e=7, premier avec 52·96=4992). Il transforme en nombres son message en remplaçant par exemple chaque lettre par son rang dans l'alphabet.
 
"JEVOUSAIME" devient : "10 05 22 15 21 19 01 09 13 05".
 
Puis il découpe son message chiffré en blocs de même longueur représentant chacun un nombre plus petit que n. Cette opération est essentielle, car si on ne faisait pas des blocs assez longs (par exemple si on laissait des blocs de 2 dans notre exemple), on retomberait sur un simple chiffre de substitution que l'on pourrait attaquer par l'analyse des fréquences.
 
Son message devient : "010 052 215 211 901 091 305"
 
Un bloc B est chiffré par la formule C = Be mod n, où C est un bloc du message chiffré que Bob enverra à Alice.
 
Après avoir chiffré chaque bloc, le message chiffré s'écrit : "0755 1324 2823 3550 3763 2237 2052".
 
 
3. Déchiffrement
 
Alice calcule à partir de p et q, qu'elle a gardés secrets, la clef d de déchiffrage (c'est sa clef privée). Celle-ci doit satisfaire l'équation e·d mod ((p-1)(q-1)) = 1. Ici, d=4279.
Chacun des blocs C du message chiffré sera déchiffré par la formule B = Cd mod n.
 
Elle retrouve : "010 052 215 211 901 091 305"
 
L'instruction d=PowerMod[e,-1,(p-1)(q-1)] de Mathematica permet de calculer d facilement.
 
En regroupant les chiffres deux par deux et en remplaçant les nombres ainsi obtenus par les lettres correspondantes, elle sait enfin que Bob l'aime secrètement, sans que personne d'autre ne puisse le savoir.


 
merci d'avance :)


---------------

Reply

Marsh Posté le 23-04-2007 à 21:17:04   

Reply

Marsh Posté le 24-04-2007 à 00:38:49    

c'est bon c'est résolu :)


---------------

Reply

Marsh Posté le 24-04-2007 à 02:04:49    

Poste la solution alors :o

Reply

Marsh Posté le 24-04-2007 à 07:28:00    

voila voila :)
 

Code :
  1. import java.math.BigInteger;
  2. import java.security.KeyPair;
  3. import java.security.KeyPairGenerator;
  4. import java.security.PrivateKey;
  5. import java.security.PublicKey;
  6. import java.security.SecureRandom;
  7. import java.security.interfaces.RSAPrivateKey;
  8. import java.security.interfaces.RSAPublicKey;
  9. import message.MessageCrypteImpl;
  10. import message.MessageImpl;
  11. public class CryptoImpl implements Crypto {
  12. private KeyPair pair;
  13. private RSAPublicKey clefPublique;
  14. private RSAPrivateKey clefPrivee;
  15. private final static int TAILLE_CLEF = 1024;
  16. /* constructeur principal */
  17. public CryptoImpl(){
  18. /* génération de la pair */
  19.  try {
  20.   KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA" );
  21.   keyPairGen.initialize(TAILLE_CLEF, new SecureRandom());
  22.   pair = keyPairGen.generateKeyPair();
  23.  }
  24.  catch (Exception e) {System.out.println(e);
  25.  }
  26.  /* récupération des clefs */
  27.  clefPublique = (RSAPublicKey)pair.getPublic();
  28.  clefPrivee = (RSAPrivateKey)pair.getPrivate();
  29. }
  30. /* -------------------------------------Cryptage-------------------------------------------------*/
  31. /*----------------------ceci est la fonction qui fait tout!---------------------
  32.  *
  33.  * Dans l'ordre :  
  34.  * -ajoute un octet au message (déja en octets) "message"
  35.  * -transforme le résultat en BigInteger
  36.  * -crypte le message par la méthode RSA (cela renvoi un BigInteger
  37.  * -retransforme le message crypté en un tableau d'octets (grace a toByteArray()  
  38.  */
  39. public MessageCrypteImpl crypterMessage(MessageImpl message) {
  40.  /* transformation de la chaine en tableau d'Octets */
  41.  byte[] msgEnOctets = message.getContenu().getBytes();
  42.  /* ajoute un octet codant le "1" au début du tableau passé en parametres */
  43.  byte[] resultat = new byte[msgEnOctets.length+1];
  44.  resultat[0] = 1;
  45.  for (int i = 0; i < msgEnOctets.length; i++) {
  46.   resultat[i+1] = msgEnOctets[i];
  47.  }
  48.  /* transforme le résultat en BigInteger */
  49.  BigInteger msgEnBigInteger = new BigInteger(resultat);
  50.  /* crypte le message par la méthode RSA grace a la clef publique (cela renvoi un BigInteger) */
  51.  BigInteger msgCrypte = msgEnBigInteger.modPow(clefPublique.getPublicExponent(), clefPublique.getModulus());
  52.  /* on retourne le message crypté sous la forme d'un tableau d'octets */
  53.  return new MessageCrypteImpl(msgCrypte.toByteArray(), null);
  54. }
  55. /* -------------------------------------Décryptage-------------------------------------------------*/
  56. public MessageImpl decrypterMessage(MessageCrypteImpl messageCrypte) {
  57.  /* On repasse le tableau d'octets en BigInteger pour pouvoir le décrypter */
  58.  BigInteger msgADecrypteEnBigInt = new BigInteger(messageCrypte.getContenuCrypte());
  59.  /* on décrypte le message grace au RSA et a la clef privée */
  60.  BigInteger msgDecrypteEnBigInt = msgADecrypteEnBigInt.modPow(clefPrivee.getPrivateExponent(), clefPrivee.getModulus());
  61.  /* on repasse le message en octets pour pouvoir retirer l'octet qu'on lui avait ajouté */
  62.  byte[] msgDecrypteEnOctets = msgDecrypteEnBigInt.toByteArray();
  63.  /* on lui retire son octet en plus */
  64.  byte[] resultat = new byte[msgDecrypteEnOctets.length-1];
  65.  for (int i = 0; i < resultat.length; i++) {
  66.   resultat[i] = msgDecrypteEnOctets[i+1];
  67.  }
  68.  /* on retourne une chaine de charactères qui provient du tableau d'octets transformé */
  69.  return new MessageImpl (new String (resultat),null);
  70. }           
  71.      /*test*/
  72. public static void main (String[] args){
  73.  MessageImpl message = new MessageImpl("ssalut louliloul!!!!",null);
  74.  CryptoImpl c = new CryptoImpl();
  75.  MessageCrypteImpl mcrypt = c.crypterMessage(message);
  76.  System.out.println(new BigInteger(mcrypt.getContenuCrypte()));
  77.  MessageImpl mdecrypt = c.decrypterMessage(mcrypt);
  78.  System.out.println(mdecrypt.getContenu());
  79. }
  80. }


---------------

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed