2010-11-30 3 views
0

J'ai créé ce programme de base pour la cryptographie Deffie Hellman. Je veux que s soit un nombre premier généré aléatoirement, et que q soit un nombre entier généré aléatoirement. sk1 et sk2 sont des clés partagées qui sont également générées aléatoirement. pk1 et pk2 sont des valeurs calculées de module que je dois prouver sont égales les unes aux autres. Je pense que ma formule est correcte mais je ne sais pas comment imprimer les valeurs de s, q, sk1, sk2, pk1 et pk2 pour vérifier mes besoins. Mon code est collé ci-dessous et j'apprécierais vraiment si quelqu'un pourrait m'aider avec les déclarations d'impression.Problème avec les valeurs d'impression

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package javaapplication1; 
import java.util.Random; 
import java.math.*; 
/** 
* 
* @author Hash 
*/ 
public class DH { 
    public static void main(String [] arg) { 

     int s, q; 
     double sk1, sk2, pk1 = 0, pk2 = 0; 
     Random generator = new Random(); 
     s = generator.nextInt(50000); 
     q = generator.nextInt(50000); 

     sk1 = generator.nextInt(); 
     sk2 = generator.nextInt(); 

     if(s==1 || s==2) { 

     for(int i = 2; i< (int)(s/2); i++) { 
      if(s/i != (int)(s/i)) { 
     double a= Math.pow(q,sk1); 
     pk1 = a%s; 

     double b= Math.pow(q, sk2); 
     pk2 = b%s; 

     if(pk1==pk2) { 
      System.out.println("true"); 

     } 

     System.out.println(s); 
     System.out.println(q); 
     System.out.println(sk1); 
     System.out.println(sk2); 
     System.out.println(pk1); 
     System.out.println(pk2); 
      } 
      } 

     } 


    }  
    } 
+0

Veuillez formater votre code en le sélectionnant et en appuyant sur CTRL + K. – EboMike

+0

Btw, quelle est votre question? Vous dites que vous n'êtes pas sûr de savoir comment imprimer les valeurs, mais vous appelez 'System.out.println'. Alors que se passe-t-il? Ne sont-ils pas imprimés? – EboMike

Répondre

1

Vos instructions d'impression sont à l'intérieur de votre cas if. Avez-vous considéré que s != 1 or s != 2?

package javaapplication1; 
import java.util.Random; 
import java.math.*; 

public class DH { 
    public static void main(String [] arg) { 

     int s, q; 
     double sk1, sk2, pk1 = 0, pk2 = 0; 
     Random generator = new Random(); 
     s = generator.nextInt(50000); 
     q = generator.nextInt(50000); 

     sk1 = generator.nextInt(); 
     sk2 = generator.nextInt(); 

     if(s==1 || s==2) { 
      for(int i = 2; i< (int)(s/2); i++) { 
       if(s/i != (int)(s/i)) { 
        double a= Math.pow(q,sk1); 
        pk1 = a%s; 
        double b= Math.pow(q, sk2); 
        pk2 = b%s; 

        if(pk1==pk2) { 
         System.out.println("true"); 
        } 
       } 
      } 
     } 
     System.out.println(s); 
     System.out.println(q); 
     System.out.println(sk1); 
     System.out.println(sk2); 
     System.out.println(pk1); 
     System.out.println(pk2);   
    } 
} 
+0

@Ebo Mike il n'est pas la valeur d'impression – Hash

+0

Ou que s/i == (int) (s/i))? – EboMike

+0

@amir aucun de ces travaux de condition :(... et S est censé être un numéro premier – Hash

1

Vous ne faites que quelque chose si if(s/i != (int)(s/i)). Puisque s et i sont des entiers, il est peu probable que cette condition soit jamais vraie.

(Pour clarifier:.. Avec « peu probable », je veux dire que cette condition ne pouvait pas être vrai s/i retourne un entier, et (int)(s/i) retournera exactement le même nombre entier)

+0

C'est le noyau de l'algorithme de Diffie Hellman que vous devez trouver les facteurs larget de s qui est un nombre entier. Comme il parcourt toutes les valeurs de i à la moitié de s, le programme trouvera au moins un facteur quand i = 1 et probablement une valeur plus élevée. –

+0

Vrai, sauf que 'i' et' s' sont tous deux des entiers, donc 's/i' renvoie un entier, et' (int) (s/i) 'renvoie le même nombre entier. – EboMike

0

Ne jamais utiliser flottant arithmétique ponctuelle pour la cryptographie. Surtout pour l'exponentiation, vous avez besoin de résultats avec plus de précision qu'un double peut vous donner. Utilisez BigInteger à la place.

Pendant que vous testez, vous ne devez pas utiliser de "nouveaux" nombres aléatoires à chaque fois. Utilisez plutôt new Random(0) afin de pouvoir reproduire vos calculs au prochain démarrage du débogueur.

Comment garantissez-vous que s est un nombre premier? Je ne peux pas le voir du code.

Veuillez mettre en retrait votre code correctement et de manière cohérente. Puisque vous utilisez Eclipse, tout ce que vous devez faire est d'appuyer une fois sur Ctrl-Maj-F.

+0

comment générer un BigInteger aléatoire? – Hash

+0

et j'utilise Netbeans v6.9.1 – Hash

+0

http://stackoverflow.com/questions/2290057 –

1

Comme s un intger généré par:

s = generator.nextInt(50000); 

Il y a 25 000 à 1 chance que:

if(s==1 || s==2) { 

sera jamais vrai. Peut-être y'a-t-il de la place si s> 2?

+0

J'essaie de faire S comme un numéro premier. et 1 et 2 sont premiers no.s – Hash

+0

S'il vous plaît lire attentivement le poste et pensez-y! Vous êtes selectign un nombre aléatoire s entre 1 et 50.000. Vous exécutez alors le corps de votre code uniquement si s vaut 1 ou 2! –

Questions connexes