长话短说:我需要使用ElGamal加密对编码数字进行乘法。

我当前将KotlinOpenJDK 1.8结合使用,并为JCE找到了一个名为Bouncy Castle的不错的提供程序。它在标准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

最佳答案

我设法研究了Bouncy Castle的源代码。似乎与@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位,而消息的ab部分必须为1024位(导致字节数组的长度为256)。模运算有时会返回大于导致org.bouncycastle.crypto.DataLengthException: input too large for ElGamal cipher.的数字

07-25 22:40