Мне удалось немного изучить исходный код Надувного Замка. Кажется, что вопреки тому, что говорит @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.