Une implémentation de rsa (rivest shamir adleman) avec des méthodes pour déterminer les clés pour de petits nombres premier----------------------------------------------------------------------------------------------------------------------------
Url : http://codes-sources.commentcamarche.net/source/53674-une-implementation-de-rsa-rivest-shamir-adleman-avec-des-methodes-pour-determiner-les-cles-pour-de-petits-nombres-premierAuteur : lemoutDate : 03/08/2013
Licence :
=========
Ce document intitulé « Une implémentation de rsa (rivest shamir adleman) avec des méthodes pour déterminer les clés pour de petits nombres premier » issu de CommentCaMarche
(codes-sources.commentcamarche.net) est mis à disposition sous les termes de
la licence Creative Commons. Vous pouvez copier, modifier des copies de cette
source, dans les conditions fixées par la licence, tant que cette note
apparaît clairement.
Description :
=============
La source comprend notamment 5 fichiers java
<br />- le fichier intitulé
Number : utiliser dans la factorisation d'un nombre en nombre premier
<br />-
le fichier intitulé Key : qui représente une clé au sens de
RSA en terme de paire (exposant,modulo)
<br />- le fichier Binary qui est une
classe gérant les transformations entier-binaire et inversement
<br />-
le fichier RSAUtil représentant l'essentiel des méthodes utiles po
ur l'application de RSA
<br />- le fichier RSA représentant l’impl
émentation du chiffrement RSA
<br /><a name='source-exemple'></a><h2> So
urce / Exemple : </h2>
<br /><pre class='code' data-mode='basic'>
// RSA.java
import java.math.*;
/**
<ul> <li> @author Charles Mouté
</li> <li> &l
t;p>Classe implementant l'algorithme de chiffrement Rivest Shamir Adleman (RS
A) </p>
</li> <li>/</li></ul>
public class RSA {
/**
<ul> <li>
Cle publique ou cle de chiffrement
</li> <li>/</li></ul>
private Key Ke ;
/**
<ul> <li> Cle privee ou cle de dechiffrement
</li> <li>/</li></ul>
private Key Kd ;
/**
<ul> <li> Construit une instance de RSA avec les
deux parametres comme cle publique et privee.
</li> <li> @param Ke Cle publi
que de l'instance
</li> <li> @param Kd Cle privee de l'instance
</li> <li> @
throws Exception Erreur lancee lorsque l'execution du code ne s'est pas deroule
correctement.
</li> <li> @see {@link #setKeys(Key, Key)}
</li> <li>/</li></u
l>
public RSA(Key Ke, Key Kd) throws Exception {
setKeys(Ke,Kd);
}
/**
<ul> <li> Cosntruit une instance de RSA avec (e,n) comme cle publique
et (d,n) comme cle privee.
</li> <li> @param e Exposant de chiffrement.
</li
> <li> @param n Modulo
</li> <li> @param d Exposant de dechiffrement
</li>
<li> @throws Exception Erreur lancee lorsque l'execution du code ne s'est pas de
roule correctement.
</li> <li> @see {@link #setKeys(Key, Key)}
</li> <li>/</
li></ul>
public RSA(BigInteger e, BigInteger n , BigInteger d) throws Exceptio
n{
setKeys(new Key(e,n),new Key(d,n));
}
/**
<ul> <li> <p>Af
fecte les deux parametres comme nouvelles cles utilisees par l'instance courante
</p>
</li> <li> @param Ke Nouvelle cle publique
</li> <li> @param Kd N
ouvelle cle privee
</li> <li> @throws Exception Erreur lancee lorsque l'execut
ion du code ne s'est pas deroule correctement.
</li> <li>/</li></ul>
public
void setKeys(Key Ke, Key Kd) throws Exception {
if(Ke==null || Kd==null) thro
w 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.getMod
ulo()) ;
if(Ke.getExponent().compareTo(BigInteger.ONE)<=0 || Ke.getExponen
t().compareTo(phi)>=0) throw new Exception("L'exposant de la cle publiqu
e 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 ;
}
/**
<ul> <li> <p>Affecte (e,n) comme nouvelle cle publique et (d,n)
comme nouvelle cle privee.</p>
</li> <li> @param e Exposant de chiffreme
nt.
</li> <li> @param n Modulo
</li> <li> @param d Exposant de dechiffrement
.
</li> <li> @throws Exception Erreur lancee lorsque l'execution du code ne s'
est pas deroule correctement.
</li> <li> @see {@link #setKeys(Key, Key)}
</li
> <li>/</li></ul>
public void setKeys(BigInteger e, BigInteger n, BigInteger
d) throws Exception {
setKeys(new Key(e,n),new Key(d,n));
}
/**
<ul
> <li> @return La cle publique utilisee par l'instance de RSA.
</li> <li>/</l
i></ul>
public Key getPublicKey() { return this.Ke; }
/**
<ul> <li> @
return La cle private utilisee par l'instance de RSA
</li> <li>/</li></ul>
p
ublic Key getPrivateKey() { return this.Kd; }
/**
<ul> <li> Chiffre le
message et retourne son chiffre.
</li> <li> @param message Message a chiffrer
.
</li> <li> @return Chiffre du parametre
</li> <li> @throws Exception Erreu
r lancee lorsque l'execution du code ne s'est pas deroule correctement.
</li>
<li>/</li></ul>
public BigInteger encrypt(BigInteger message) throws Exception
{
//if(message.compareTo(BigInteger.ZERO)<0 || message.compareTo(Ke.getMod
ulo().subtract(BigInteger.ONE))>0) throw new Exception("Le message ne pe
ut etre chiffre, car "+message+" n'est pas dans l'intervalle ferme [0,
"+(Ke.getModulo().subtract(BigInteger.ONE))+"]");
if(message.c
ompareTo(BigInteger.ZERO)<0) throw new Exception("Le message ne peut etr
e chiffre, car il est negatif ");
if(message.compareTo(Ke.getModulo())&l
t;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){
in
t count = incr - (param.length()%incr) ;
for(int i=1;i<=count;i++) param
= "0"+param ;
}
int begin = 0 ;
String result = "&qu
ot;;
//System.out.print("algo crypted : ");
while(begin<par
am.length()){
int end = ( (begin+incr)<param.length())? (begin+incr):par
am.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("Erre
ur Conception Interne");
int size = (incr+1) - value.length();
fo
r(int i=1;i<=size;i++) value = "0"+value;
//System.out.print(&
quot;("+aux+","+value+") ");
result+=value;
b
egin+=incr;
}
//System.out.println();
return (new BigInteger
(result));
}
}
public String toString(){
return ("[ Public Key
= "+Ke+","+" Private Key = "+Kd+" ]");
}
/**
<ul> <li> Dechiffre le message et retourne le message en clair.
</l
i> <li> @param message Message a chiffrer.
</li> <li> @return Dechiffre du pa
rametre
</li> <li> @throws Exception Erreur lancee lorsque l'execution du code
ne s'est pas deroule correctement.
</li> <li>/</li></ul>
public BigInteger
decrypt(BigInteger message) throws Exception {
//if(message.compareTo(BigInte
ger.ZERO)<0 || message.compareTo(Kd.getModulo().subtract(BigInteger.ONE))>
0) throw new Exception("Le message ne peut etre dechiffre, car "