Трансформация зашифрованного текста в Proxy Re-Encryption - PullRequest
3 голосов
/ 23 февраля 2012

Я пытаюсь реализовать повторное шифрование прокси для проверки концепции со следующими параметрами.

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

1 Ответ

3 голосов
/ 23 февраля 2012

У вас есть две проблемы:

  1. 2 не является корнем примитива по модулю 31, поэтому ваш "g" не является генератором для мультипликативной группы.Вместо этого вы можете использовать 3.

  2. Похоже, что кто-то допустил ошибку при объяснении Blaze, Bleumer & Strauss.Вам нужно вычислить b / a по модулю фи (q) вместо по модулю q.Затем вы можете использовать теорему Эйлера, чтобы показать, что перешифрование работает.Неверно, что (g ^ a) ^ (a ^ -1) = g (mod q), когда ^ -1 вычисляется по модулю q.Это также означает, что sk_a и sk_b должны быть относительно простыми по отношению к фи (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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...