• Aucun résultat trouvé

Tout d'abord, il est très important de noter que selon Porticor Cloud Security, la tâche la plus importante de la solution proposée est de protéger la clé de chiffrement.

En effet, comme l'a affirmé Ariel Dan, l'un des co-fondateurs de Porticor, contacté par nos soins via e-mail (voir annexe 5): " In cloud computing, we believe that protecting the encryption keys is the most important task. By implementing Homomorphic key management, we can provide the assurance that your encryption key is never revealed in the cloud, even while in use. We're the only encryption vendor that can claim such claim, therefore we are proud to deliver the strongest cloud encryption technology (keep in mind that we also deploy our split-key technology in addition to homomorphic key management)".

Par ce mail, on ne peut que confirmer ce que les explications de la société laisse sous-entendre, à savoir que le chiffrement homomorphique n'est pas réellement utilisé sur les données mêmes stockées dans le Cloud mais bien sur la clé qui sert à utiliser ces données.

En effet, la solution offerte par Porticor Cloud Security est un stockage de données sécurisées avec un algorithme AES-256, c'est-à-dire un algorithme AES (symétrique) dont la clé a une longueur de 256 bits. Mais la spécificité de cette solution réside dans sa clé. En effet, cette clé de 256 bits est composée de deux parties différentes: la Master key, en possession du client, et une autre partie de la clé, en possession du Porticor Virtual Key Management.

Figure 25:Porticor Virtual Key Management Service (https://www.porticor.com)

C'est dans cette clé que réside la partie homomorphique du système. Effectivement, lorsque l'application veut accéder aux données chiffrées stockées dans la partie Cloud, elle doit utiliser les deux parties de la clé de manière dynamique pour chiffrer et déchiffrer les données encodées. Or, comme cette utilisation de la clé se veut dynamique, Porticora décidé de chiffrer cette clé finale de manière homomorphique.

L'avantage indéniable de ce système est que la clé voyage donc de manière chiffrée (homomorphiquement) entre le système de gestion des clés dePorticoret le serveur où se trouve leCloud. Elle ne peut donc pas être volée ou piratée.

Mais il faut également noter que la partie de la clé que le client possède doit voyager sans protection entre son ordinateur et le système de gestion des clés de Porticor. Ce voyage de la Master key est indéniablement le point faible de cette solution. Car si un pirate arrive à intercepter cette clé lors du voyage initial, il est à même de se faire passer pour le client et d'accéder au contenu de sonCloud.

Bien évidemment, Porticor a essayé de protéger au maximum ce transfert initial. C'est pourquoi la connexion se fait via le protocole https, c'est-à-dire via une connexion sécurisée parSecure Socket Layer (SSL). Ce type de protection relativement vieux (2001) se situe entre la couche application et la couche transport dans le modèle OSI [29]. Il repose sur l'utilisation combinée d'un chiffrement asymétrique pour l'authentification et d'un chiffrement symétrique (plus rapide) pour assurer la transmission des informations [30] [31].

Malheureusement, ce type de protection pour l'envoi de la clé au système de gestion des clés de Porticor est relativement dépassé. En effet, plusieurs failles ont déjà été découvertes dans le système et dans son implémentation. Pour ne citer que la plus récente, la faille Heartbleed, rendue publique le 7 avril 2014, se situait au niveau de l'implémentation d’une mise à jour du certificat SSL. Cette vulnérabilité a touché plus d'un demi-million de serveurs dontTwitter, Dropbox, Yahoo, Facebook... [32] [33] [34].

Il apparaît donc que si Porticor offre une bonne solution d'utilisation du chiffrement homomorphique, elle comporte malheureusement des points faibles. Dans le cas de la Défense, ces points faibles restent inacceptables car ils sont une brèche par laquelle des pirates informatiques sont susceptibles d'entrer.

3.3 Démonstration

Cette partie sera consacrée au test proprement dit de la solution depuis son téléchargement jusqu'à la manipulation de données dans un espace protégé.

Figure 26: La solution Porticor (https://www.porticor.com)

La première étape consiste à télécharger la solution Porticor. D’entrée de jeu, deux solutions s'offrent au client: un choix entre deux images virtuelles4 d'une machine Porticor.

La première image est destinée aux services AWS (Amazon Web Services) qui est une plateforme de collection de services informatiques distants fournis via internet par le groupe américain de commerce électroniqueAmazon.com[35] [36]. La seconde image est destinée à VMWare qui est un logiciel connu de virtualisation. C'est cette dernière solution qui a été retenue pour les tests.

Bien évidemment, pour l'utilisation de chacune de ces images, les logiciels de virtualisation utilisés doivent avoir été installés au préalable, dans notre cas, VMware Player version 6.0.2.

L'image à télécharger sur le site de Porticor (Porticor-VPD-v2.35) se présente donc sous la forme d'une image pour VMWare (.ova) de 1,3 Go environ.

Figure 27: Image OVA

Cette image s'ouvre très facilement grâce à l'onglet "Open a virtual machine" de VMWare Player.

Après l'importation de l'image de la machine, il faut ajouter des disques durs sur lesquels seront stockées les informations chiffrées. Pour cela, il suffit de modifier les options de la machine virtuelle et, sous l'onglet "Hardware", cliquer sur "Add" pour ajouter un composant hardware fictif, dans notre cas, un disque dur.

Figure 29: Ajout des disques durs

Pour notre exemple, deux disques durs de 1Go ont été ajoutés.

Figure 28: Début avec VMWare Player

Ensuite, il faut démarrer la machine en double-cliquant sur l’image. Une fois cette étape remplie, la machine virtuelle Porticorest installée et démarrée sur l'ordinateur local.

Cette machine possède aussi un serveur qui démarre simultanément et

automatiquement avec elle et qui est joignable à tout moment en tapant son adresse IP dans un navigateur web (avec une connexion protégée en SSL):

https://xxx.xxx.xxx.xxx

Pour faciliter la vie du client, une fois la machine démarrée, elle affiche à l'écran son adresse IP sur laquelle il faut se connecter pour atteindre le serveur.

L'étape suivante est la connexion sur le serveur web de la machine. Pour l'exemple, nous avons utilisé le navigateur webOpera.

Figure 30: Adresse IP du serveur web

Figure 31: Login

Dès l’accès à cette page, des informations personnelles sont demandées pour pouvoir se connecter aux services offerts parPorticor.

Figure 32: Informations supplémentaires

Une fois des données enregistrées, le client doit encore remplir quelques formalités nécessaires à l'élaboration d'unCloud.

Figure 33: Début du projetPorticor

Ensuite, débute une des étapes les plus importantes mais également la plus dangereuse:

la communication au client de saMaster Key. C'est en effet à ce moment-là que le niveau de sécurité est au plus bas et si un pirate accède à ce moment précis à l'ordinateur du client, il peut, sans encombres, lui voler sa clé.

Figure 34:Master Key

De plus, on peut remarquer qu'une option existe pour permettre à la clé du client d’avoir le statut "persistant", c'est-à-dire que la clé va être stockée dans le navigateur web du client et s'afficher quand un site web la demande. Cette option ne devrait jamais être utilisée car elle stocke la clé la plus essentielle sans protection dans le navigateur web.

Une fois cette étape remplie, l'utilisateur a enfin accès à tous les services proposés par Porticor.

Figure 35:Porticor Project Setup

Pour garantir la confidentialité des informations, une étape supplémentaire est encore nécessaire : la création de disques durs sécurisés sur lesquels le client pourra stocker ses données de manière sécurisée.

Pour cela, il faut se rendre dans l'onglet "Protected File Systems". Dans cet onglet apparaissent les deux disques ajoutés sur la machine virtuelle.

Figure 36: Disques durs

Avant de pouvoir les utiliser, il faut configurer le type de stockage que le client veut utiliser. En effet,Porticoren propose quatre différents.

Figure 37: Type de stockage

Le premier est le Network File System (NFS) [37] [38].C'est en réalité un système de partage de fichiers en réseau développé pour les systèmes UNIX mais dont des versions existent pourMacintoshouMicrosoft Windows.

Le second type est le Windows Sharequi n'est ni plus ni moins le système développé par Microsoft Windows pour le partage de fichiers en réseau.

Le troisième et le quatrième type correspondent au protocole iSCSI (Internet Small Computer System Interface) [39] [40]. C'est un protocole de stockage en réseau basé sur le protocole IP destiné à relier les installations de stockage de données.

En fonction de l'environnement du client et de ses désirs, il devra choisir un type de stockage adéquat. Si le client utilise, par exemple, Microsoft Windows, et qu'il désire juste stocker des fichiers sur la machine, le plus judicieux pour lui sera de choisir le Windows Share.

C'est la solution que nous avons retenu pour notre exemple.

Figure 38: Titre

Notons au passage, le nom du "Disque 1" (qui correspond au "Volume ID" dans la figure 38):

hl-4dec5a3f22d6

Figure 39: Adresse duCloud

L'étape suivante consiste à appuyer sur "use it". Une fenêtre apparaît alors donnant au client l'adresse réseau du disque sécurisé.

Il ne reste donc plus au client qu'à entrer cette adresse dans son explorateur Windows pour être redirigé de manière sécurisée sur ce disque faisant office deCloud.

Figure 40: Premier dossier sur leCloud

Comme démontré dans la figure 40 par la création d'un dossier "Premier dossier", le client peut à présent stocker à sa guise des données dans cet espace que Porticor présente comme sécurisé.

3.4 Conclusion partielle

Ce chapitre démontre la facilité de mise en place d'une solution commerciale telle que Porticor. Mais il démontre également ses faiblesses.

Il apparaît, suite à l'installation de la machine, que sa mise en place, relativement simple, exige certains pré-requis tel que disposer de VMWare ou AWS, pouvoir mettre en œuvre ces programmes facilement (pour y créer des disques durs virtuels par exemple).

D'autre part, le côté sécurité de la solution reste relativement basique. En effet, bien que Porticor se vante d'utiliser un chiffrement homomorphique, ce système de codage n'est utilisé que pour la clé et uniquement lorsqu'elle est utilisée sur le serveur Cloud. La sécurité maximale reste donc restreinte à une partie seulement du mécanisme, la clé, et, de ce fait peut être considérée globalement comme peu sûr.

De plus, dans le cas de Porticor, il apparaît que la clé est générée par le Porticor Virtual Key Management qui appartient à la société. Il est donc facile aux propriétaires de Porticorde disposer des clés des clients, ce qui constitue un danger supplémentaire.

Ce mécanisme a cependant l'avantage d'être un des meilleurs systèmes disponibles dans une solution commerciale utilisable simplement.

La porte est donc encore grande ouverte aux nouvelles implémentations et aux innovations car un tel système est encore trop faible pour protéger des données sensibles telles que celles détenues par la Défense.

4 Conclusion

Comme ce travail l'a démontré, l'utilisation duCloudpar la Défense n'est pas une chose aisée si la sécurité des informations doit être garantie.

En effet, dans le premier chapitre, nous avons pu observer que les méthodes de chiffrement classiques n'étaient pas adaptées à cette utilisation. De plus, il a été démontré que tous les systèmes de codage présentés ne peuvent pas s'appliquer à ce genre d'utilisation. Le choix adéquat du chiffrement ou de la combinaison de chiffrement est donc relativement complexe.

Heureusement, une solution prometteuse existe: le chiffrement homomorphique. Mais il comporte, lui aussi, à l’heure actuelle, des faiblesses et des défauts: sa complexité pour n'en citer qu'un.

Il est donc apparu que ces méthodes de codage ne sont pas encore tout à fait prêtes pour réaliser une solution miracle qui offrirait vitesse et sécurité en même temps.

Ensuite, il a été démontré qu'une implémentation du chiffrement homomorphique est possible et fonctionnelle et ceci au travers du projet THEP. Ce projet n'est évidemment pas exploitable en tant que tel mais il forme une bonne base depuis laquelle pourront se développer beaucoup d'améliorations et d'innovations.

La dernière partie de ce travail a été consacrée aux solutions commerciales et plus particulièrement à l'une d'elles:Porticor.

Ce chapitre a mis en lumière les avantages et les inconvénients de ce genre de solution toute faite. La solution particulière Porticor, bien qu’étant la meilleure solution disponible actuellement, révèle des faiblesses comme celle, essentielle, du chiffrement des données stockées sur le Cloud moins performante que celle de sa clé.

La conséquence directe de toutes ces constatations est qu'aucune solution proposée ici n'est utilisable telle quelle par la Défense. En effet, trop de failles ont été découvertes dans la sécurité des différents systèmes ou trop d'inconvénients y étaient liés. Il est donc regrettable de conclure que la Défense va devoir attendre ou proposer un développement de ces solutions avant de pouvoir stocker toutes ses informations sur un Cloudcivil de manière hautement sécurisée en utilisant la solution homomorphique tant sur les clés que sur les données stockées sur le Net.

5 Recommandations

A la suite de ce travail, il apparaît donc qu'aucune solution de stockage de données de la Défense sur unCloudcivil n'est encore totalement fiable en matière de sécurité.

Dès lors, il serait plus raisonnable d'attendre une vraie avancée significative dans le domaine de la sécurité informatique avant de se lancer dans l'utilisation d'un Cloud. En effet, il serait trop dangereux de vouloir utiliser un produit qui ne soit pas tout à fait sécurisé.

Il est indéniable que l'utilisation d'un Cloud pourrait permettre de réaliser des économies et il est également très clair qu'à l'heure actuelle, la Défense en a cruellement besoin. Il serait donc facile de sacrifier un peu de sécurité pour éviter de dépenser trop de ressources.

Mais il aussi très important de noter que certaines informations détenues par la Défense sont sensibles et ne peuvent pas être divulguées au grand public. Il est donc impensable de les mettre en danger à quelque prix que ce soit. Bien sûr, si la pression économique se fait trop forte, il est encore possible de ne stocker qu'une partie des données sur ces Cloudsmais il ne faut pas perdre de vue que la sécurité n'a pas de prix.

Il faudrait donc attendre qu'une solution plus efficace soit mise en place et, idéalement, qu'elle fasse ses preuves avant d’être utilisée.

Références

[01] http://fr.wikipedia.org/wiki/Liaison_16, consulté le 15 avril 2014

[02] http://www.infoworld.com/d/cloud-computing/the-cloud-killing-traditional-hardware-and-software-216963, consulté le 15 avril 2014

[03] http://en.wikipedia.org/wiki/Rogue_nations, consulté le 11 mai 2014 [04] http://www.cryptage.org/rsa.html, consulté le 13 mars 2014

[05] http://en.wikipedia.org/wiki/RSA_%28cryptosystem%29, consulté le 13 mars 2014

[06] http://fr.wikipedia.org/wiki/Chiffrement_RSA, consulté le 13 novembre 2013

[07] http://en.wikipedia.org/wiki/Advanced_Encryption_Standard, consulté le 20 novembre 2013

[08] Andrey Bogdanov, Dmitry Khovratovich et Christian Rechberger, "Biclique Cryptanalysis of the Full AES"

[09] http://fr.wikipedia.org/wiki/Advanced_Encryption_Standard, consulté le 11 novembre 2013

[10] http://fr.wikipedia.org/wiki/Chiffrement_asym%C3%A9trique, consulté le 15 mars 2014

[11] http://en.wikipedia.org/wiki/Public-key_cryptography, consulté le 13 avril 2014

[12] http://fr.wikipedia.org/wiki/Algorithme_d%27Euclide_%C3%A9tendu, consulté le 19 novembre 2013

[13] http://sebsauvage.net/comprendre/encryptage/crypto_rsa.html, consulté le 15 mars 2014

[14] Maha Tebaa, Saïd El Hajji Abdellatif El Ghazi, "Homomorphic Encryption Applied to the Cloud Computing Security" , 04/07/2012, London, U.K.

[15] http://en.wikipedia.org/wiki/Homomorphic_encryption#Fully_homomorphic _encryption", consulté le 16 novembre 2013

[16] Craig Gentry, "A FULLY HOMOMORPHIC ENCRYPTION SCHEME", septembre 2009

[18] http://fr.wikipedia.org/wiki/Cryptosyst%C3%A8me_de_Paillier, consulté le 5 mars 2014

[19] http://en.wikipedia.org/wiki/Paillier_cryptosystem, consulté le 5 mars 2014

[20] Dan Boneh, Eu-Jin Goh et Kobbi Nissim ,"Evaluating 2-DNF Formulas on Ciphertexts", 02/04/2006

[21] Marten van Dijk; Craig Gentry, Shai Halevi, and Vinod Vaikuntanathan,

"Fully Homomorphic Encryption over the Integers", 12/11/2009

[22] http://en.wikipedia.org/wiki/Deterministic_encryption, consulté le 8 mars 2014

[23] http://en.wikipedia.org/wiki/Probabilistic_encryption, consulté le 18 mars 2014

[24] http://docs.oracle.com/javase/7/docs/api/java/security/SecureRandom.html, consulté le 1 avril 2014

[25] Federal Information Processing Standards Publication, "Security Requirements for Cryptographic Modules", 11/01/1994

[26]

http://imss-www.upmf-grenoble.fr/prevert/Prog/Java/CoursJava/lesBig.html, consulté le 2 avril 2014

[27] http://fr.wikipedia.org/wiki/Constructeur_%28programmation_informatiqu e%29, consulté le 2 avril 2014

[28] https://www.porticor.com/

[29] http://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI, consulté le 5 avril 2014 [30] http://fr.wikipedia.org/wiki/Transport_Layer_Security#S.C3.A9curisation_

du_protocole, consulté le 3 avril 2014

[31] http://en.wikipedia.org/wiki/Transport_Layer_Security, consulté le 3 avril 2014

[32] http://news.netcraft.com/archives/2014/04/08/half-a-million-widely-trusted-websites-vulnerable-to-heartbleed-bug.html, consulté le 3 avril 2014 [33] http://en.wikipedia.org/wiki/Heartbleed, consulté le 3 avril 2014 [34] http://fr.wikipedia.org/wiki/Heartbleed, consulté le 3 avril 2014

[35] http://fr.wikipedia.org/wiki/Amazon_Web_Services, consulté le 3 avril 2014

[36] http://en.wikipedia.org/wiki/Amazon_Web_Services, consulté le 3 avril 2014

[37] http://en.wikipedia.org/wiki/Network_File_System, consulté le 3 avril 2014

[38] http://fr.wikipedia.org/wiki/Network_File_System, consulté le 3 avril 2014 [39] http://fr.wikipedia.org/wiki/ISCSI, consulté le 3 avril 2014

[40] http://en.wikipedia.org/wiki/ISCSI, consulté le 3 avril 2014

[41] Damien Stehle; Ron Steinfeld (2010-05-19). "Faster Fully Homomorphic Encryption", 15/09/2010

[42] Kai-Min Chung, Yael Kalai&SalilVadhan, "Improved Delegation of Computationusing Fully Homomorphic Encryption", 2010

[43] http://fr.wikipedia.org/wiki/S%C3%A9curit%C3%A9_du_cloud#Historique_

des_attaques_dans_le_cloud, consulté le 06 octobre 2013

[44] http://www.technologyreview.com/news/424942/a-cloud-that-cant-leak/, consulté le 06 octobre 2013

[45] http://h30458.www3.hp.com/fr/fr/ent/1251728.html, consulté le 06 mars 2014

[46] Craig Gentry, Shai Halevi, "Implementing Gentry's Fully-Homomorphic Encryption Scheme", IBM Research, 04/02/2011

[47] http://www.i-programmer.info/news/149-security/5823-open-source-homomorphic-cryptography.html, consulté le 08 mars 2014

[48] http://nakedsecurity.sophos.com/2013/05/05/ibm-takes-big-new-step-in-cryptography/, consulté le 08 mars 2014

[49] Dan Boneh, Craig Gentry, Shai Halevi, Frank Wang, David J. Wu,"Private DatabaseQueries Using Somewhat Homomorphic Encryption"

[50] Shiyuan Wang, Divyakant Agrawal, et Amr El Abbadi, "Is Homomorphic Encryption the Holy Grail for Database Queries on Encrypted Data?", University of California, Santa Barbara, USA

[51] http://cryptography.wikia.com/wiki/Homomorphic_encryption, consulté le 4 novembre 2013

[52] http://www.elemathique.com/cryptographie_asymetrique.php, consulté le 14 avril 2014

Annexes Annexe1 :EncryptedInteger.class

publicclassEncryptedInteger implementsSerializable {

privatestaticfinallongserialVersionUID=1L;

privateBigIntegercipherval;

privatePublicKey pub;

private Random rng;

privatetransient Constructor rngCons;

privatetransient Constructor biCons;

private Class bigi;

publicEncryptedInteger(BigIntegerplainval,PublicKey pub) throwsBigIntegerClassNotValid

{

this(plainval, pub, java/math/BigInteger);

}

publicEncryptedInteger(PublicKey pub) throwsBigIntegerClassNotValid

{

this(BigInteger.ZERO, pub, java/math/BigInteger);

}

publicEncryptedInteger(PublicKey pub, Class c) throwsBigIntegerClassNotValid

{

this(BigInteger.ZERO, pub, c);

}

publicEncryptedInteger(BigIntegerplainval,PublicKey pub, Class c) throwsBigIntegerClassNotValid

{

rng=newSecureRandom();

this.pub = pub;

rngCons=findRngCons(c);

biCons=findBICons(c);

bigi= c;

set(plainval);

}

publicEncryptedInteger(EncryptedInteger other) {

rng=newSecureRandom();

cipherval=other.getCipherVal();

pub=other.getPublicKey();

rngCons=other.rngCons;

biCons=other.biCons;

}

publicBigInteger set(BigIntegerplainval) throwsBigIntegerClassNotValid

BigInteger r =BigInteger.ZERO;

do { try {

r =(BigInteger)rngCons.newInstance(new Object[]{

Integer.valueOf(pub.getBits()),rng });

}

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct the given big integer class");

}}while(r.compareTo(pub.getN())>=0);

BigInteger g =pub.getG();

try{

if(biCons!=null) {

g =(BigInteger)biCons.newInstance(new Object[]{

pub.getG() });

} }

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct");

}

cipherval=g.modPow(plainval,pub.getNSquared());

BigInteger x =r.modPow(pub.getN(),pub.getNSquared());

cipherval=cipherval.multiply(x);

cipherval= cipherval.mod(pub.getNSquared());

return r;

}

publicEncryptedInteger add(EncryptedInteger other) throwsPublicKeysNotEqualException

{

if(!pub.equals(other.getPublicKey())) {

thrownewPublicKeysNotEqualException("Cannot add integers encrypted with different public keys");

}else {

EncryptedIntegertmp_int=newEncryptedInteger(this);

BigIntegertmp=cipherval.multiply(other.getCipherVal());

tmp= tmp.mod(pub.getNSquared());

tmp_int.setCipherVal(tmp);

returntmp_int;

} }

publicEncryptedInteger add(BigInteger other) throwsBigIntegerClassNotValid

{

EncryptedIntegertmp_int=newEncryptedInteger(this);

BigInteger g =pub.getG();

{

g =(BigInteger)biCons.newInstance(new Object[]{

pub.getG() });

}}

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct");

}BigIntegertmp=cipherval.multiply(g.modPow(other,pub.getNSquared()));

tmp= tmp.mod(pub.getNSquared());

tmp_int.setCipherVal(tmp);

returntmp_int;

}

publicEncryptedInteger multiply(BigInteger other) throwsBigIntegerClassNotValid

{EncryptedIntegertmp_int=newEncryptedInteger(this);

BigInteger c =cipherval;

try {

if(biCons!=null) {

c =(BigInteger)biCons.newInstance(new Object[]{

cipherval });

} }

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct");

}

BigIntegertmp=c.modPow(other,pub.getNSquared());

tmp_int.setCipherVal(tmp);

returntmp_int;

}

publicvoidrerandomize()

throwsBigIntegerClassNotValid {

BigInteger r =BigInteger.ZERO;

try {

r =(BigInteger)rngCons.newInstance(new Object[]{

Integer.valueOf(pub.getBits()),rng });

}

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct the given big integer class");

}

r =r.modPow(pub.getN(),pub.getNSquared());

cipherval=cipherval.multiply(r);

cipherval= cipherval.mod(pub.getNSquared());

}

publicBigInteger decrypt(PrivateKeypriv) throwsBigIntegerClassNotValid

{

BigInteger c =cipherval;

try {

if(biCons!=null) {

c =(BigInteger)biCons.newInstance(new Object[]{

cipherval });

}}

catch(Exception e) {

thrownewBigIntegerClassNotValid("Could not construct");

}

BigIntegerplainval=c.modPow(priv.getLambda(),priv.getPublicKey().getNSquare d());

plainval=plainval.subtract(BigInteger.ONE);

plainval=plainval.divide(priv.getPublicKey().getN());

plainval=plainval.multiply(priv.getMu());

plainval= plainval.mod(priv.getPublicKey().getN());

returnplainval;

}

publicBigIntegergetCipherVal() {

returncipherval;

}

publicPublicKeygetPublicKey() {

return pub;

}

privatevoidsetCipherVal(BigIntegercipherval) {

this.cipherval=cipherval;

}

private Constructor findRngCons(Class c) throwsBigIntegerClassNotValid

{

Constructor cons =null;

Constructor aconstructor[];

int k =(aconstructor=c.getConstructors()).length;

for(int j =0; j < k; j++) {

Constructor i=aconstructor[j];

Class params[]=i.getParameterTypes();

if(params.length!=2||!params[0].getCanonicalName().equals("int")||!params[1 ].getCanonicalName().equals("java.util.Random"))

{

continue;

}

cons=i;

break;

}

constructor");

}else {

return cons;

}}

private Constructor findBICons(Class c) {

Constructor cons =null;

Constructor aconstructor[];

int k =(aconstructor=c.getConstructors()).length;

for(int j =0; j < k; j++)

{ Constructor i=aconstructor[j];

Class params[]=i.getParameterTypes();

if(params.length!=1||!params[0].getCanonicalName().equals("java.math.BigInt eger"))

{continue;

}

cons=i;

break;

}

return cons;

}

private Object readResolve()

throwsObjectStreamException,BigIntegerClassNotValid {

rngCons=findRngCons(bigi);

biCons=findBICons(bigi);

returnthis;

} }

Annexe2 :PrivateKey.class

packagethep.paillier;

importjava.io.Serializable;

importjava.math.BigInteger;

importjava.security.SecureRandom;

// Referenced classes of package thep.paillier:

// PublicKey

publicclassPrivateKey implementsSerializable {

privatestaticfinallongserialVersionUID=1L;

privatePublicKey pub;

privateBigInteger lambda;

privateBigInteger mu;

publicPrivateKey(int bits) {

java.util.Randomrng=newSecureRandom();

BigInteger p =newBigInteger(bits /2,10,rng);

BigInteger q =newBigInteger(bits /2,10,rng);

BigInteger n =p.multiply(q);

p =p.subtract(BigInteger.ONE);

q=q.subtract(BigInteger.ONE);

lambda=p.multiply(q);

pub=newPublicKey(bits, n);

mu=lambda.modInverse(pub.getN());

}

publicBigIntegergetLambda() {

return lambda;

}

publicPublicKeygetPublicKey() {

return pub;

}

BigIntegergetMu() {

return mu;

} }

Documents relatifs