mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-11 22:22:21 +08:00
Add Elliptic Curve Cryptography (#5700)
This commit is contained in:
106
src/test/java/com/thealgorithms/ciphers/ECCTest.java
Normal file
106
src/test/java/com/thealgorithms/ciphers/ECCTest.java
Normal file
@ -0,0 +1,106 @@
|
||||
package com.thealgorithms.ciphers;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* ECCTest - Unit tests for the ECC (Elliptic Curve Cryptography) implementation.
|
||||
* This class contains various test cases to validate the encryption and decryption functionalities.
|
||||
* It ensures the correctness and randomness of ECC operations.
|
||||
*
|
||||
* @author xuyang
|
||||
*/
|
||||
public class ECCTest {
|
||||
ECC ecc = new ECC(256); // Generate a 256-bit ECC key pair. Calls generateKeys(bits) to create keys including privateKey and publicKey.
|
||||
|
||||
/**
|
||||
* Test the encryption functionality: convert plaintext to ciphertext and output relevant encryption data.
|
||||
*/
|
||||
@Test
|
||||
void testEncrypt() {
|
||||
String textToEncrypt = "Elliptic Curve Cryptography";
|
||||
|
||||
ECC.ECPoint[] cipherText = ecc.encrypt(textToEncrypt); // Perform encryption
|
||||
|
||||
// Output private key information
|
||||
System.out.println("Private Key: " + ecc.getPrivateKey());
|
||||
|
||||
// Output elliptic curve parameters
|
||||
ECC.EllipticCurve curve = ecc.getCurve();
|
||||
System.out.println("Elliptic Curve Parameters:");
|
||||
System.out.println("a: " + curve.getA());
|
||||
System.out.println("b: " + curve.getB());
|
||||
System.out.println("p: " + curve.getP());
|
||||
System.out.println("Base Point G: " + curve.getBasePoint());
|
||||
|
||||
// Verify that the ciphertext is not empty
|
||||
assertEquals(cipherText.length, 2); // Check if the ciphertext contains two points (R and S)
|
||||
|
||||
// Output the encrypted coordinate points
|
||||
System.out.println("Encrypted Points:");
|
||||
for (ECC.ECPoint point : cipherText) {
|
||||
System.out.println(point); // Calls ECPoint's toString() method
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the decryption functionality: convert ciphertext back to plaintext using known private key and elliptic curve parameters.
|
||||
*/
|
||||
@Test
|
||||
void testDecryptWithKnownValues() {
|
||||
// 1. Define the known private key
|
||||
BigInteger knownPrivateKey = new BigInteger("28635978664199231399690075483195602260051035216440375973817268759912070302603");
|
||||
|
||||
// 2. Define the known elliptic curve parameters
|
||||
BigInteger a = new BigInteger("64505295837372135469230827475895976532873592609649950000895066186842236488761"); // Replace with known a value
|
||||
BigInteger b = new BigInteger("89111668838830965251111555638616364203833415376750835901427122343021749874324"); // Replace with known b value
|
||||
BigInteger p = new BigInteger("107276428198310591598877737561885175918069075479103276920057092968372930219921"); // Replace with known p value
|
||||
ECC.ECPoint basePoint = new ECC.ECPoint(new BigInteger("4"), new BigInteger("8")); // Replace with known base point coordinates
|
||||
|
||||
// 3. Create the elliptic curve object
|
||||
ECC.EllipticCurve curve = new ECC.EllipticCurve(a, b, p, basePoint);
|
||||
|
||||
// 4. Define the known ciphertext containing two ECPoints (R, S)
|
||||
ECC.ECPoint rPoint = new ECC.ECPoint(new BigInteger("103077584019003058745849614420912636617007257617156724481937620119667345237687"), new BigInteger("68193862907937248121971710522760893811582068323088661566426323952783362061817"));
|
||||
ECC.ECPoint sPoint = new ECC.ECPoint(new BigInteger("31932232426664380635434632300383525435115368414929679432313910646436992147798"), new BigInteger("77299754382292904069123203569944908076819220797512755280123348910207308129766"));
|
||||
ECC.ECPoint[] cipherText = new ECC.ECPoint[] {rPoint, sPoint};
|
||||
|
||||
// 5. Create an ECC instance and set the private key and curve parameters
|
||||
ecc.setPrivateKey(knownPrivateKey); // Use setter method to set the private key
|
||||
ecc.setCurve(curve); // Use setter method to set the elliptic curve
|
||||
|
||||
// 6. Decrypt the known ciphertext
|
||||
String decryptedMessage = ecc.decrypt(cipherText);
|
||||
|
||||
// 7. Compare the decrypted plaintext with the expected value
|
||||
String expectedMessage = "Elliptic Curve Cryptography"; // Expected plaintext
|
||||
assertEquals(expectedMessage, decryptedMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that encrypting the same plaintext with ECC produces different ciphertexts.
|
||||
*/
|
||||
@Test
|
||||
void testCipherTextRandomness() {
|
||||
String message = "Elliptic Curve Cryptography";
|
||||
|
||||
ECC.ECPoint[] cipherText1 = ecc.encrypt(message);
|
||||
ECC.ECPoint[] cipherText2 = ecc.encrypt(message);
|
||||
|
||||
assertNotEquals(cipherText1, cipherText2); // Ensure that the two ciphertexts are different
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the entire ECC encryption and decryption process.
|
||||
*/
|
||||
@Test
|
||||
void testECCEncryptionAndDecryption() {
|
||||
String textToEncrypt = "Elliptic Curve Cryptography";
|
||||
ECC.ECPoint[] cipherText = ecc.encrypt(textToEncrypt);
|
||||
String decryptedText = ecc.decrypt(cipherText);
|
||||
assertEquals(textToEncrypt, decryptedText); // Verify that the decrypted text matches the original text
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user