代理重新加密中的密文转换

时间:2012-02-23 01:48:27

标签: encryption cryptography

我正在尝试使用以下参数实现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);

1 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. 2不是原始根模31,因此您的“g”不是乘法组的生成器。您可以使用3代替。

  2. 看起来有人在解释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。

  3. 以下内容应如您所愿:

    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);