我正在尝试使用以下参数实现proxy re encryption概念证明。
q = 31, g = 2, sk_a = 3, sk_b = 5,
sk_a和q是共素数,因此在mod q中,sk_a的反函数退出。
proxy_key = sk_b/sk_a
其中proxy_key的计算方法是将sk_b与sk_a的模数倒数相乘,即(sk_b.sk_a inverse)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);
答案 0 :(得分:3)
你有两个问题:
2不是原始根模31,因此您的“g”不是乘法组的生成器。您可以使用3代替。
看起来有人在解释Blaze,Bleumer& amp;斯特劳斯。你需要计算b / a modulo phi(q)而不是模q。然后你可以使用欧拉定理来证明再加密是有效的。当以模q计算^ -1时,(g ^ a)^(a ^ -1)= g(mod q)是不正确的。这也意味着sk_a和sk_b应该是phi(q)的相对素数。请尝试使用7和11。
以下内容应如您所愿:
BigInteger q = new BigInteger("31");
BigInteger phi = new BigInteger("30");
BigInteger g = new BigInteger("3");
BigInteger sk_a = new BigInteger("7");
BigInteger sk_b = new BigInteger("11");
BigInteger proxy_key = sk_b.multiply(sk_a.modInverse(phi)).mod(phi);
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);