gpt4 book ai didi

java - 使用 Bouncy CaSTLe 的 ElGamal 同态乘法

转载 作者:行者123 更新时间:2023-12-01 16:52:18 26 4
gpt4 key购买 nike

长话短说:我需要使用 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

最佳答案

我已经设法调查了一些 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()
}

这可能只是部分解决方案。问题是, key 的 p 部分是 1025 位,而消息的 ab 部分必须是 1024 位(结果在长度为 256 的字节数组中)。模数运算有时返回的数字大于导致 org.bouncycaSTLe.crypto.DataLengthException:输入对于 ElGamal 密码来说太大。

关于java - 使用 Bouncy CaSTLe 的 ElGamal 同态乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61663602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com