【问题标题】:ElGamal homomorphic multiplication using Bouncy Castle使用 Bouncy Castle 的 ElGamal 同态乘法
【发布时间】:2020-05-07 17:05:07
【问题描述】:

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

我目前正在使用KotlinOpenJDK 1.8,并找到了名为Bouncy Castle 的JCE 提供者。它在标准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 似乎可以使用 RSA/ECB/NoPadding。您可以将加密的输出扔到 BigIntegers,将它们相乘,再乘以 k 并解密底层字节数组。
  • @PresidentJamesMoveonPolk 请看我下面的答案,因为我已经找到了部分可行的解决方案

标签: java kotlin cryptography bouncycastle elgamal


【解决方案1】:

我已经设法调查了 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.的数字

【讨论】:

  • @PresidentJamesMoveonPolk 不用担心,如果您有任何关于p的建议,我将不胜感激
  • 查看您的问题和答案,我想我不明白您要完成什么。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多