【发布时间】:2019-12-20 10:13:56
【问题描述】:
我希望在 java/kotlin 中生成 ed25519 密钥。密钥对应该是确定性的,如果可以提供生成过程中使用的一些种子信息,他们可以再次生成相同的密钥对。
我知道可以使用助记符来实现这一点。请告诉我如何处理这个问题。我正在寻找可以帮助我在 java 中实现这一目标的知名库。
【问题讨论】:
标签: java kotlin cryptography ecdsa ed25519
我希望在 java/kotlin 中生成 ed25519 密钥。密钥对应该是确定性的,如果可以提供生成过程中使用的一些种子信息,他们可以再次生成相同的密钥对。
我知道可以使用助记符来实现这一点。请告诉我如何处理这个问题。我正在寻找可以帮助我在 java 中实现这一目标的知名库。
【问题讨论】:
标签: java kotlin cryptography ecdsa ed25519
您应该使用libsodium,这是文档中的link。
libsodium 是DJB 的NaCl 最积极维护的实现,因此如果您使用ed25519 或curve25519 椭圆曲线加密,您应该使用libsodium。
Java/Kotlin 中有一个 number 的绑定。
它真的很容易使用而且很安全,例如,它在恒定时间内执行标量乘法。
为了回答您关于确定性的问题,libsodium 提供了一种从种子生成确定性密钥的机制。请注意,您需要确保您的种子有足够的熵来保证安全。
您应该调用 int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, const unsigned char *seed); 到 generate 来自种子的 ed25519 密钥对。
Here 是一个在 Java 中提供与该函数的绑定的库:
/**
* Deterministically generate a public and secret key.
* Store the seed somewhere if you want to generate these
* keys again.
* @param publicKey Public key will be populated here of size {@link #PUBLICKEYBYTES}.
* @param secretKey Secret key will be populated here of size {@link #SECRETKEYBYTES}.
* @param seed A random seed of size {@link #SEEDBYTES}.
* @return True if generated successfully.
*/
boolean cryptoKxSeedKeypair(byte[] publicKey, byte[] secretKey, byte[] seed);
【讨论】: