Я пытаюсь реализовать повторное шифрование прокси для проверки концепции со следующими параметрами.
q = 31, g = 2, sk_a = 3, sk_b = 5,
sk_a и q являются взаимно простыми числами, поэтому инверсия sk_a завершается в моде q.
proxy_key = sk_b/sk_a
, где proxy_key рассчитывается умножением sk_b на модульную инверсию sk_a, т.е. (sk_b.sk_a инверсия) mod q
текст шифра: y = (g^sk_a) mod q
Для преобразования зашифрованного текста я использую (y^proxy) mod q.
Согласно алгоритму шифрования преобразования текста должно получиться (g^sk_b) mod q
, но оно у меня не работает.
Я не уверен, в чем прикол. Я использую следующий код.
BigInteger q = new BigInteger("31");
BigInteger g = new BigInteger("2");
BigInteger sk_a = new BigInteger("3");
BigInteger sk_b = new BigInteger("5");
BigInteger proxy_key = sk_b.multiply(sk_a.modInverse(q)).mod(q);
BigInteger y = g.modPow(sk_a, q);
System.out.println("Cipher Text: " + y);
BigInteger transformation = y.modPow(proxy_key, q);
System.out.println("Cipher Text Transformation: " + transformation);