Умножение гомоморфов Эль-Гамаля c с использованием надувного замка - PullRequest
0 голосов
/ 07 мая 2020

Короче говоря: мне нужно использовать шифрование ElGamal для умножения закодированных чисел.

В настоящее время я использую Kotlin с OpenJDK 1.8 и нашел хорошего провайдера для JCE под названием Надувной замок. Он обеспечивает шифрование ElGamal в рамках стандартного JCE API. Однако я совершенно не представляю, как выполнять умножение в зашифрованных сообщениях, которые я получаю.

Security.addProvider(BouncyCastleProvider())

val keys = KeyPairGenerator.getInstance("ElGamal", "BC").generateKeyPair()
val cipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC")
cipher.init(Cipher.ENCRYPT_MODE, keys.public)
val eleven = BigInteger.valueOf(11)
val three = BigInteger.valueOf(3)
val eleven_e = cipher.doFinal(eleven.toByteArray())
val three_e = cipher.doFinal(three.toByteArray())
//Do three_e * eleven_e

1 Ответ

0 голосов
/ 08 мая 2020

Мне удалось немного изучить исходный код Надувного Замка. Кажется, что вопреки тому, что говорит @PresidentJamesMoveonPolk ниже, код должен иметь возможность умножать два закодированных числа:

fun multiplyElGamal(num1: ByteArray, num2: ByteArray, p: BigInteger): ByteArray {
    val a1 = num1.copyOfRange(0, num1.size / 2)
    val b1 = num1.copyOfRange(num1.size / 2, num1.size)
    val a2 = num2.copyOfRange(0, num2.size / 2)
    val b2 = num2.copyOfRange(num2.size / 2, num2.size)
    return (BigInteger(1, a1) * BigInteger(1, a2) % p).toByteArray() + (BigInteger(1, b1) * BigInteger(1, b2) % p).toByteArray()
}

Это может быть только частичное решение. Проблема в том, что часть p ключа составляет 1025 бит, а части a и b сообщения должны быть 1024 битами (в результате получается массив байтов длиной 256). Операция модуля иногда возвращает числа больше, чем это, что приводит к org.bouncycastle.crypto.DataLengthException: input too large for ElGamal cipher.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...