Implementarea algoritmului Diffie-Hellman
Algoritmul Diffie-Hellman:
Algoritmul Diffie-Hellman este utilizat pentru a stabili un secret partajat care poate fi folosit pentru comunicații secrete în timp ce se face schimb de date printr-o rețea publică folosind curba eliptică pentru a genera puncte și a obține cheia secretă folosind parametrii.
- De dragul simplității și implementării practice a algoritmului, vom lua în considerare doar 4 variabile, un prim P și G (o rădăcină primitivă a lui P) și două valori private a și b.
- P și G sunt ambele numere disponibile public. Utilizatorii (să spunem Alice și Bob) aleg valorile private a și b și generează o cheie și o schimbă public. Persoana opusă primește cheia și asta generează o cheie secretă după care are aceeași cheie secretă de criptat.
Explicația pas cu pas este următoarea:
| Alice | Bob |
|---|---|
| Cheile publice disponibile = P G | Cheile publice disponibile = P G |
| Cheie privată selectată = a | Cheie privată selectată = b |
| Cheia generată = x = G^a mod P | Cheia generată = y = G^b mod P |
| Are loc schimbul de chei generate | |
| Cheia primită = y | cheia primită = x |
| Cheie secretă generată = k_a = y^a mod P | Cheie secretă generată = k_b = x^b mod P |
| Algebric se poate demonstra că k_a = k_b | |
| Utilizatorii au acum o cheie secretă simetrică de criptat |
Exemplu:
Step 1: Alice and Bob get public numbers P = 23 G = 9
Step 2: Alice selected a private key a = 4 and
Bob selected a private key b = 3
Step 3: Alice and Bob compute public values
Alice: x =(9^4 mod 23) = (6561 mod 23) = 6
Bob: y = (9^3 mod 23) = (729 mod 23) = 16
Step 4: Alice and Bob exchange public numbers
Step 5: Alice receives public key y =16 and
Bob receives public key x = 6
Step 6: Alice and Bob compute symmetric keys
Alice: ka = y^a mod p = 65536 mod 23 = 9
Bob: kb = x^b mod p = 216 mod 23 = 9
Step 7: 9 is the shared secret.
Implementare:
C++C/* This program calculates the Key for two persons using the Diffie-Hellman Key exchange algorithm using C++ */ #include#include using namespace std ; // Power function to return value of a ^ b mod P long long int power ( long long int a long long int b long long int P ) { if ( b == 1 ) return a ; else return ((( long long int ) pow ( a b )) % P ); } // Driver program int main () { long long int P G x a y b ka kb ; // Both the persons will be agreed upon the // public keys G and P P = 23 ; // A prime number P is taken cout < < 'The value of P : ' < < P < < endl ; G = 9 ; // A primitive root for P G is taken cout < < 'The value of G : ' < < G < < endl ; // Alice will choose the private key a a = 4 ; // a is the chosen private key cout < < 'The private key a for Alice : ' < < a < < endl ; x = power ( G a P ); // gets the generated key // Bob will choose the private key b b = 3 ; // b is the chosen private key cout < < 'The private key b for Bob : ' < < b < < endl ; y = power ( G b P ); // gets the generated key // Generating the secret key after the exchange // of keys ka = power ( y a P ); // Secret key for Alice kb = power ( x b P ); // Secret key for Bob cout < < 'Secret key for the Alice is : ' < < ka < < endl ; cout < < 'Secret key for the Bob is : ' < < kb < < endl ; return 0 ; } // This code is contributed by Pranay Arora Java/* This program calculates the Key for two persons using the Diffie-Hellman Key exchange algorithm */ #include#include // Power function to return value of a ^ b mod P long long int power ( long long int a long long int b long long int P ) { if ( b == 1 ) return a ; else return ((( long long int ) pow ( a b )) % P ); } // Driver program int main () { long long int P G x a y b ka kb ; // Both the persons will be agreed upon the // public keys G and P P = 23 ; // A prime number P is taken printf ( 'The value of P : %lld n ' P ); G = 9 ; // A primitive root for P G is taken printf ( 'The value of G : %lld nn ' G ); // Alice will choose the private key a a = 4 ; // a is the chosen private key printf ( 'The private key a for Alice : %lld n ' a ); x = power ( G a P ); // gets the generated key // Bob will choose the private key b b = 3 ; // b is the chosen private key printf ( 'The private key b for Bob : %lld nn ' b ); y = power ( G b P ); // gets the generated key // Generating the secret key after the exchange // of keys ka = power ( y a P ); // Secret key for Alice kb = power ( x b P ); // Secret key for Bob printf ( 'Secret key for the Alice is : %lld n ' ka ); printf ( 'Secret Key for the Bob is : %lld n ' kb ); return 0 ; } Python// This program calculates the Key for two persons // using the Diffie-Hellman Key exchange algorithm class GFG { // Power function to return value of a ^ b mod P private static long power ( long a long b long p ) { if ( b == 1 ) return a ; else return ((( long ) Math . pow ( a b )) % p ); } // Driver code public static void main ( String [] args ) { long P G x a y b ka kb ; // Both the persons will be agreed upon the // public keys G and P // A prime number P is taken P = 23 ; System . out . println ( 'The value of P:' + P ); // A primitive root for P G is taken G = 9 ; System . out . println ( 'The value of G:' + G ); // Alice will choose the private key a // a is the chosen private key a = 4 ; System . out . println ( 'The private key a for Alice:' + a ); // Gets the generated key x = power ( G a P ); // Bob will choose the private key b // b is the chosen private key b = 3 ; System . out . println ( 'The private key b for Bob:' + b ); // Gets the generated key y = power ( G b P ); // Generating the secret key after the exchange // of keys ka = power ( y a P ); // Secret key for Alice kb = power ( x b P ); // Secret key for Bob System . out . println ( 'Secret key for the Alice is:' + ka ); System . out . println ( 'Secret key for the Bob is:' + kb ); } } // This code is contributed by raghav14C## Diffie-Hellman Code # Power function to return value of a^b mod P def power ( a b p ): if b == 1 : return a else : return pow ( a b ) % p # Main function def main (): # Both persons agree upon the public keys G and P # A prime number P is taken P = 23 print ( 'The value of P:' P ) # A primitive root for P G is taken G = 9 print ( 'The value of G:' G ) # Alice chooses the private key a # a is the chosen private key a = 4 print ( 'The private key a for Alice:' a ) # Gets the generated key x = power ( G a P ) # Bob chooses the private key b # b is the chosen private key b = 3 print ( 'The private key b for Bob:' b ) # Gets the generated key y = power ( G b P ) # Generating the secret key after the exchange of keys ka = power ( y a P ) # Secret key for Alice kb = power ( x b P ) # Secret key for Bob print ( 'Secret key for Alice is:' ka ) print ( 'Secret key for Bob is:' kb ) if __name__ == '__main__' : main ()JavaScript// C# implementation to calculate the Key for two persons // using the Diffie-Hellman Key exchange algorithm using System ; class GFG { // Power function to return value of a ^ b mod P private static long power ( long a long b long P ) { if ( b == 1 ) return a ; else return ((( long ) Math . Pow ( a b )) % P ); } public static void Main () { long P G x a y b ka kb ; // Both the persons will be agreed upon the // public keys G and P P = 23 ; // A prime number P is taken Console . WriteLine ( 'The value of P:' + P ); G = 9 ; // A primitive root for P G is taken Console . WriteLine ( 'The value of G:' + G ); // Alice will choose the private key a a = 4 ; // a is the chosen private key Console . WriteLine ( 'nThe private key a for Alice:' + a ); x = power ( G a P ); // gets the generated key // Bob will choose the private key b b = 3 ; // b is the chosen private key Console . WriteLine ( 'The private key b for Bob:' + b ); y = power ( G b P ); // gets the generated key // Generating the secret key after the exchange // of keys ka = power ( y a P ); // Secret key for Alice kb = power ( x b P ); // Secret key for Bob Console . WriteLine ( 'nSecret key for the Alice is:' + ka ); Console . WriteLine ( 'Secret key for the Alice is:' + kb ); } } // This code is contributed by Pranay Arora< script > // This program calculates the Key for two persons // using the Diffie-Hellman Key exchange algorithm // Power function to return value of a ^ b mod P function power ( a b p ) { if ( b == 1 ) return a ; else return (( Math . pow ( a b )) % p ); } // Driver code var P G x a y b ka kb ; // Both the persons will be agreed upon the // public keys G and P // A prime number P is taken P = 23 ; document . write ( 'The value of P:' + P + '
' ); // A primitive root for P G is taken G = 9 ; document . write ( 'The value of G:' + G + '
' ); // Alice will choose the private key a // a is the chosen private key a = 4 ; document . write ( 'The private key a for Alice:' + a + '
' ); // Gets the generated key x = power ( G a P ); // Bob will choose the private key b // b is the chosen private key b = 3 ; document . write ( 'The private key b for Bob:' + b + '
' ); // Gets the generated key y = power ( G b P ); // Generating the secret key after the exchange // of keys ka = power ( y a P ); // Secret key for Alice kb = power ( x b P ); // Secret key for Bob document . write ( 'Secret key for the Alice is:' + ka + '
' ); document . write ( 'Secret key for the Bob is:' + kb + '
' ); // This code is contributed by Ankita saini < /script>
IeșireThe value of P : 23 The value of G : 9 The private key a for Alice : 4 The private key b for Bob : 3 Secret key for the Alice is : 9 Secret key for the Bob is : 9