· 9 years ago · Oct 20, 2016, 06:54 AM
1package me.academeg.SplitSecretChina;
2
3@SuppressWarnings("unused")
4public class SplitSecretChinaDecode {
5
6 private int[] publicKey;
7 private int[] secretKey;
8 private int countSecret;
9
10 public SplitSecretChinaDecode(int[] publicKey, int[] secretKey) {
11 this.publicKey = publicKey;
12 this.secretKey = secretKey;
13 if (publicKey.length != secretKey.length) {
14 throw new IllegalArgumentException("Different keys length");
15 }
16 countSecret = publicKey.length;
17 }
18
19 public int getSecret() {
20 int[] f = generateAdditionalArr();
21 int secret = 0;
22 int multiplyPublic = getMultiplyPublicWithout(-1);
23 for (int i = 0; i < countSecret; i++) {
24 secret = secret + (secretKey[i] * getMultiplyPublicWithout(i) * f[i]);
25 }
26 return secret % multiplyPublic;
27 }
28
29 private int[] generateAdditionalArr() {
30 int[] arr = new int[countSecret];
31 for (int i = 0; i < countSecret; i++) {
32 arr[i] = multiInverse(getMultiplyPublicWithout(i), publicKey[i]);
33 }
34 return arr;
35 }
36
37 private int getMultiplyPublicWithout(int withoutIndex) {
38 int res = 1;
39 for (int i = 0; i < countSecret; i++) {
40 if (i != withoutIndex) {
41 res *= publicKey[i];
42 }
43 }
44 return res;
45 }
46
47 private int multiInverse(long aa, long bb) {
48 long a = aa;
49 long b = bb;
50 long x = 0;
51 long y = 1;
52 long lastX = 1;
53 long lastY = 0;
54 long temp;
55 while (b != 0) {
56 long q = a / b;
57 long r = a % b;
58
59 a = b;
60 b = r;
61
62 temp = x;
63 x = lastX - q * x;
64 lastX = temp;
65
66 temp = y;
67 y = lastY - q * y;
68 lastY = temp;
69 }
70 return (int) ((lastX % bb + bb) % bb);
71 }
72}