· 9 years ago · Nov 16, 2016, 03:48 PM
1import java.math.BigInteger;
2import java.security.SecureRandom;
3import java.util.Random;
4
5public class ElgamalBatchVerification {
6 public static void main(String[] args) {
7//Key Generation
8 Random random = new SecureRandom();
9 BigInteger secretKey = new BigInteger("123456789987654321");
10 BigInteger p = BigInteger.probablePrime(64, random);
11 BigInteger g = new BigInteger("3");
12 BigInteger y = g.modPow(secretKey, p);
13
14//public key (q,g,y)
15//Sign
16 String[] messages = {"4564468461684516161651686", "987979851684656846518651826","654654845684865181548351685", "789746543548646813521831535","32546461168531211316513168", "8789486434846515486165184615","321321584345684484548354355", "3211231218486854546358", "323131335485684358355","456456456464684646516845465","65646465461684516161651686", "789464351684656846518651826","351646845684865181548351685", "13165463548646813521831535", "1168531211316513168","536465464115486165184615", "345534564654156548354355", "4561324546358","354878451558355", "46468464456845465"};
17
18 BigInteger[] r = new BigInteger[messages.length];
19 BigInteger[] s = new BigInteger[messages.length];
20 BigInteger m, k;
21
22 for (int i = 0; i < messages.length; i++) {
23 m = new BigInteger(messages[i]);
24 k = BigInteger.probablePrime(64, random);
25 r[i] = g.modPow(k, p);
26 s[i] = ((new BigInteger(m.hashCode() +"")).subtract(secretKey.multiply(r[i]))).multiply(k.modInverse(p.subtract(new BigInteger("1"))));
27 }
28
29//Normal Verification
30 BigInteger normal_rhs, normal_lhs;
31 long normal_start = System.nanoTime();
32 for (int i = 0; i < messages.length; i++) {
33 normal_rhs = g.modPow(new BigInteger((new BigInteger(messages[i])).hashCode() + ""), p);
34 normal_lhs = y.modPow(r[i], p).multiply(r[i].modPow(s[i], p)).mod(p);
35 if (normal_rhs.equals(normal_lhs)) {
36 System.out.println("Sign " + i + " : true");
37 } else {
38 System.out.println("Sign " + i + " : false");
39 }
40 }
41
42 long normal_end = System.nanoTime();
43 System.out.println("normal verification time"+(normal_end - normal_start));
44 BigInteger yr_multiplication = new BigInteger("1");
45 BigInteger sumhm = new BigInteger("0");
46
47 long batch_start = System.nanoTime();
48 for (int i = 0; i < messages.length; i++) {
49 sumhm = sumhm.add(new BigInteger((new BigInteger(messages[i])).hashCode() + ""));
50 yr_multiplication = yr_multiplication.multiply(y.modPow(r[i], p).multiply(r[i].modPow(s[i],p)).mod(p));
51 }
52
53 BigInteger batch_rhs = g.modPow(sumhm, p);
54 BigInteger batch_lhs = yr_multiplication.mod(p);
55
56 if (batch_rhs.equals(batch_lhs)) {
57 System.out.println("batch signatures verified");
58 } else {
59 System.out.println("exists forged sigantures");
60 }
61
62 long batch_end = System.nanoTime();
63 System.out.println("batch verification time "+(batch_end - batch_start));
64 }
65}