Diffie-Hellman アルゴリズムの実装
ディフィー・ヘルマンアルゴリズム:
Diffie-Hellman アルゴリズムは、楕円曲線を使用してポイントを生成し、パラメータを使用して秘密鍵を取得することでパブリック ネットワーク上でデータを交換しながら、秘密通信に使用できる共有秘密を確立するために使用されています。
- 単純化とアルゴリズムの実際的な実装のために、1 つの素数 P および G (P の原始根) と 2 つのプライベート値 a および b の 4 つの変数のみを考慮します。
- P と G はどちらも公開されている番号です。ユーザー (アリスとボブなど) はプライベート値 a と b を選択し、キーを生成して公開で交換します。相手はキーを受け取り、それによって秘密キーが生成され、その後同じ秘密キーを使って暗号化します。
ステップバイステップの説明は次のとおりです。
| アリス | ボブ |
|---|---|
| 利用可能な公開鍵 = P G | 利用可能な公開鍵 = P G |
| 秘密キーが選択されました = a | 秘密キーが選択されました = b |
| 生成されたキー = x = G^a mod P | 生成されたキー = y = G^b mod P |
| 生成されたキーの交換が行われます | |
| 受信したキー = y | 受信したキー = x |
| 生成された秘密キー = k_a = y^a mod P | 生成された秘密キー = k_b = x^b mod P |
| 代数的に示すことができます k_a = k_b | |
| ユーザーは暗号化するための対称秘密鍵を取得できるようになりました。 |
例:
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.
実装:
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>
出力The 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