使用 Bouncy Castle 的 ElGamal 同态乘法
ElGamal homomorphic multiplication using Bouncy Castle
长话短说:我需要使用 ElGamal
加密来对编码数字执行乘法运算。
我目前正在将 Kotlin
与 OpenJDK 1.8
一起使用,并为 JCE 找到了一个名为 Bouncy Castle 的不错的提供程序。它在标准 JCE API
内提供 ElGamal
加密。但是,我完全不知道如何对从中获取的加密消息执行乘法运算。
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
我设法调查了一些充气城堡的源代码。似乎与@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 的字节数组)。模数运算有时 returns 数字大于导致 org.bouncycastle.crypto.DataLengthException: input too large for ElGamal cipher.
的数字
长话短说:我需要使用 ElGamal
加密来对编码数字执行乘法运算。
我目前正在将 Kotlin
与 OpenJDK 1.8
一起使用,并为 JCE 找到了一个名为 Bouncy Castle 的不错的提供程序。它在标准 JCE API
内提供 ElGamal
加密。但是,我完全不知道如何对从中获取的加密消息执行乘法运算。
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
我设法调查了一些充气城堡的源代码。似乎与@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 的字节数组)。模数运算有时 returns 数字大于导致 org.bouncycastle.crypto.DataLengthException: input too large for ElGamal cipher.