Une implémentation de rsa (rivest shamir adleman) avec des méthodes pour déterminer les clés pour de petits nombres premier

Soyez le premier à donner votre avis sur cette source.

Vue 8 467 fois - Téléchargée 1 924 fois

Description

La source comprend notamment 5 fichiers java
- le fichier intitulé Number : utiliser dans la factorisation d'un nombre en nombre premier
- le fichier intitulé Key : qui représente une clé au sens de RSA en terme de paire (exposant,modulo)
- le fichier Binary qui est une classe gérant les transformations entier-binaire et inversement
- le fichier RSAUtil représentant l'essentiel des méthodes utiles pour l'application de RSA
- le fichier RSA représentant l’implémentation du chiffrement RSA

Source / Exemple :


// RSA.java

import java.math.*;

/**

  • @author Charles Mouté
  • <p>Classe implementant l'algorithme de chiffrement Rivest Shamir Adleman (RSA) </p>
  • /
public class RSA { /**
  • Cle publique ou cle de chiffrement
  • /
private Key Ke ; /**
  • Cle privee ou cle de dechiffrement
  • /
private Key Kd ; /**
  • Construit une instance de RSA avec les deux parametres comme cle publique et privee.
  • @param Ke Cle publique de l'instance
  • @param Kd Cle privee de l'instance
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • @see {@link #setKeys(Key, Key)}
  • /
public RSA(Key Ke, Key Kd) throws Exception { setKeys(Ke,Kd); } /**
  • Cosntruit une instance de RSA avec (e,n) comme cle publique et (d,n) comme cle privee.
  • @param e Exposant de chiffrement.
  • @param n Modulo
  • @param d Exposant de dechiffrement
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • @see {@link #setKeys(Key, Key)}
  • /
public RSA(BigInteger e, BigInteger n , BigInteger d) throws Exception{ setKeys(new Key(e,n),new Key(d,n)); } /**
  • <p>Affecte les deux parametres comme nouvelles cles utilisees par l'instance courante</p>
  • @param Ke Nouvelle cle publique
  • @param Kd Nouvelle cle privee
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • /
public void setKeys(Key Ke, Key Kd) throws Exception { if(Ke==null || Kd==null) throw new Exception("L'une ou l'autre des deux cles est/sont incorrecte(s)"); if(Ke.getModulo()!=Kd.getModulo()) throw new Exception("Les deux cles n'ont pas le meme modulo"); BigInteger phi = RSAUtil.phi(Ke.getModulo()) ; if(Ke.getExponent().compareTo(BigInteger.ONE)<=0 || Ke.getExponent().compareTo(phi)>=0) throw new Exception("L'exposant de la cle publique est incorrect"); if(Kd.getExponent().compareTo(BigInteger.ONE)<=0 || Kd.getExponent().compareTo(phi)>=0) throw new Exception("L'exposant de la cle privee est incorrect"); this.Ke = Ke ; this.Kd = Kd ; } /**
  • <p>Affecte (e,n) comme nouvelle cle publique et (d,n) comme nouvelle cle privee.</p>
  • @param e Exposant de chiffrement.
  • @param n Modulo
  • @param d Exposant de dechiffrement.
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • @see {@link #setKeys(Key, Key)}
  • /
public void setKeys(BigInteger e, BigInteger n, BigInteger d) throws Exception { setKeys(new Key(e,n),new Key(d,n)); } /**
  • @return La cle publique utilisee par l'instance de RSA.
  • /
public Key getPublicKey() { return this.Ke; } /**
  • @return La cle private utilisee par l'instance de RSA
  • /
public Key getPrivateKey() { return this.Kd; } /**
  • Chiffre le message et retourne son chiffre.
  • @param message Message a chiffrer.
  • @return Chiffre du parametre
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • /
public BigInteger encrypt(BigInteger message) throws Exception{ //if(message.compareTo(BigInteger.ZERO)<0 || message.compareTo(Ke.getModulo().subtract(BigInteger.ONE))>0) throw new Exception("Le message ne peut etre chiffre, car "+message+" n'est pas dans l'intervalle ferme [0,"+(Ke.getModulo().subtract(BigInteger.ONE))+"]"); if(message.compareTo(BigInteger.ZERO)<0) throw new Exception("Le message ne peut etre chiffre, car il est negatif "); if(message.compareTo(Ke.getModulo())<0) return RSAUtil.modularPower(message, Ke.getExponent(), Ke.getModulo()) ; else{ int incr = Ke.getModulo().toString().length() -1 ; if(incr<=0) throw new Exception("Le message ne peut etre decoupe de telle sorte qu'il soit dans [0,"+Ke.getModulo().subtract(BigInteger.ONE)+"]"); String param = message.toString(); if((param.length()%incr)!=0){ int count = incr - (param.length()%incr) ; for(int i=1;i<=count;i++) param = "0"+param ; } int begin = 0 ; String result = ""; //System.out.print("algo crypted : "); while(begin<param.length()){ int end = ( (begin+incr)<param.length())? (begin+incr):param.length(); BigInteger aux = new BigInteger(param.substring(begin, end)); String value = (RSAUtil.modularPower(aux, Ke.getExponent(), Ke.getModulo())).toString(); if(value.length()>(incr+1)) throw new Exception("Erreur Conception Interne"); int size = (incr+1) - value.length(); for(int i=1;i<=size;i++) value = "0"+value; //System.out.print("("+aux+","+value+") "); result+=value; begin+=incr; } //System.out.println(); return (new BigInteger(result)); } } public String toString(){ return ("[ Public Key = "+Ke+","+" Private Key = "+Kd+" ]"); } /**
  • Dechiffre le message et retourne le message en clair.
  • @param message Message a chiffrer.
  • @return Dechiffre du parametre
  • @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule correctement.
  • /
public BigInteger decrypt(BigInteger message) throws Exception { //if(message.compareTo(BigInteger.ZERO)<0 || message.compareTo(Kd.getModulo().subtract(BigInteger.ONE))>0) throw new Exception("Le message ne peut etre dechiffre, car "+message+" n'est pas dans l'intervalle ferme [0,"+(Kd.getModulo().subtract(BigInteger.ONE))+"]"); if(message.compareTo(BigInteger.ZERO)<0) throw new Exception("Le message ne peut etre chiffre, car il est negatif "); if(message.compareTo(Kd.getModulo())<0) return RSAUtil.modularPower(message, Kd.getExponent(), Kd.getModulo()) ; else{ int incr = Ke.getModulo().toString().length() ; if(incr<=0) throw new Exception("Le message ne peut etre decoupe de telle sorte qu'il soit dans [0,"+Ke.getModulo().subtract(BigInteger.ONE)+"]"); String param = message.toString(); if( (param.length()%incr)!=0){ int count = incr - (param.length()%incr) ; for(int i=1;i<=count;i++) param = "0"+param; } int begin = 0 ; String result = ""; //System.out.print("algo decrypted : "); while(begin<param.length()){ BigInteger aux = new BigInteger(param.substring(begin, begin+incr)); //BigInteger value = RSAUtil.modularPower(aux, Kd.getExponent(), Kd.getModulo()) ; String value = (RSAUtil.modularPower(aux, Kd.getExponent(), Kd.getModulo())).toString() ; if(value.length()<(incr-1)){ int count = incr-1 - value.length() ; for(int i=1;i<=count;i++) value = "0"+value; } //System.out.print("("+aux+","+value+") "); result += value; begin+=incr; } //System.out.println(); return (new BigInteger(result)); } } public static void main(String[] arg) throws Exception { String message = "<document> <titre>Test</titre> <content>Le reste n'a rien avoir et je suis épuisé</content> </document>"; System.out.println("Message a chiffrer = "+message); BigInteger number = RSAUtil.stringToNumber(message); System.out.println("number = "+number); BigInteger[] primes = RSAUtil.generateTwoPrimes(5); System.out.println("p = "+primes[0]+"; q="+primes[1]); Key[] keys = RSAUtil.buildKeysOf(primes[0], primes[1]); RSA rsa = new RSA(keys[0],keys[1]); System.out.println(rsa); BigInteger crypted = rsa.encrypt(number); System.out.println("crypted = "+crypted); String answer = RSAUtil.numberToString(crypted); System.out.println("Valeur ascii crypted = "+answer); BigInteger decrypted = rsa.decrypt(crypted); System.out.println("decrypted = "+decrypted); //System.out.println("(decrypted == number) = "+(decrypted.compareTo(number)==0)); String ans = RSAUtil.numberToString(decrypted); System.out.println("Valeur Ascii decrypted = "+ans); } }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
248 -
Bonjour,

Intéressant de voir une implémentation de cet algorithme, cependant, le package JAAS propose de le faire en quelques lignes.

Au sujet de ton code :

- il y a vraiment une chose horrible, c'est les throws Exception. C'est une maladresse qu'on retrouve parfois dans les codes des très grands débutants. Tu devrais créer des types d'exception personnalisés pour faire cela proprement.

- Ce serait bien de ne pas laisser des lignes en commentaire quand tu postes une source, ca n'apporte rien à la version finale.

- C'est bien pour la javadoc
lemout
Messages postés
6
Date d'inscription
mardi 27 février 2007
Statut
Membre
Dernière intervention
30 mai 2016
-
Merci pour les remarques, j'essayerais d'en tenir compte dans les prochaines sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.