Skip to content

Commit f021dbb

Browse files
authored
updated DiffieHellman.java
1 parent bd54505 commit f021dbb

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed
Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,64 @@
1+
package com.thealgorithms.ciphers;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
15
import java.math.BigInteger;
6+
import java.util.stream.Stream;
7+
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.Arguments;
10+
import org.junit.jupiter.params.provider.MethodSource;
211

312
public final class DiffieHellman {
13+
14+
// Private constructor to prevent instantiation of utility class
415
private DiffieHellman() {
516
throw new UnsupportedOperationException("Utility class");
617
}
718

19+
// Method to calculate public value (g^x mod p)
820
public static BigInteger calculatePublicValue(BigInteger base, BigInteger secret, BigInteger prime) {
21+
// Returns g^x mod p
922
return base.modPow(secret, prime);
1023
}
1124

25+
// Method to calculate the shared secret key (otherPublic^secret mod p)
1226
public static BigInteger calculateSharedSecret(BigInteger otherPublicValue, BigInteger secret, BigInteger prime) {
27+
// Returns b^x mod p or a^y mod p
1328
return otherPublicValue.modPow(secret, prime);
1429
}
15-
}
1630

17-
// DiffieHellmanTest.java - JUnit Tests
18-
import org.junit.jupiter.api.DisplayName;
19-
import org.junit.jupiter.params.ParameterizedTest;
20-
import org.junit.jupiter.params.provider.CsvSource;
21-
import static org.junit.jupiter.api.Assertions.*;
31+
// *********** Unit Test Section **************
2232

23-
import java.math.BigInteger;
33+
// Method to provide test data for public key calculation
34+
private static Stream<Arguments> providePublicKeyData() {
35+
return Stream.of(
36+
// base, secret, prime, expected public value
37+
Arguments.of(new BigInteger("5"), new BigInteger("6"), new BigInteger("23"), new BigInteger("8")),
38+
Arguments.of(new BigInteger("2"), new BigInteger("5"), new BigInteger("13"), new BigInteger("6"))
39+
);
40+
}
41+
42+
// Test for public key calculation
43+
@ParameterizedTest
44+
@MethodSource("providePublicKeyData")
45+
public void testCalculatePublicValue(BigInteger base, BigInteger secret, BigInteger prime, BigInteger expected) {
46+
assertEquals(expected, DiffieHellman.calculatePublicValue(base, secret, prime));
47+
}
2448

25-
public class DiffieHellmanTest {
49+
// Method to provide test data for shared secret calculation
50+
private static Stream<Arguments> provideSharedSecretData() {
51+
return Stream.of(
52+
// otherPublic, secret, prime, expected shared secret
53+
Arguments.of(new BigInteger("8"), new BigInteger("6"), new BigInteger("23"), new BigInteger("2")),
54+
Arguments.of(new BigInteger("6"), new BigInteger("5"), new BigInteger("13"), new BigInteger("12"))
55+
);
56+
}
2657

58+
// Test for shared secret calculation
2759
@ParameterizedTest
28-
@DisplayName("Diffie-Hellman Key Exchange Test")
29-
@CsvSource({
30-
"23, 5, 6, 15",
31-
"97, 7, 12, 23",
32-
"61, 2, 9, 19"
33-
})
34-
void testDiffieHellman(String nStr, String gStr, String xStr, String yStr) {
35-
BigInteger n = new BigInteger(nStr);
36-
BigInteger g = new BigInteger(gStr);
37-
BigInteger x = new BigInteger(xStr);
38-
BigInteger y = new BigInteger(yStr);
39-
40-
BigInteger a = DiffieHellman.calculatePublicValue(g, x, n);
41-
BigInteger b = DiffieHellman.calculatePublicValue(g, y, n);
42-
43-
BigInteger k1 = DiffieHellman.calculateSharedSecret(b, x, n);
44-
BigInteger k2 = DiffieHellman.calculateSharedSecret(a, y, n);
45-
46-
assertEquals(k1, k2, "Shared secret keys do not match for inputs n=" + nStr + ", g=" + gStr);
60+
@MethodSource("provideSharedSecretData")
61+
public void testCalculateSharedSecret(BigInteger otherPublicValue, BigInteger secret, BigInteger prime, BigInteger expected) {
62+
assertEquals(expected, DiffieHellman.calculateSharedSecret(otherPublicValue, secret, prime));
4763
}
4864
}

0 commit comments

Comments
 (0)