如何解决如何将 ed25519 标量转换为 x25519 进行加密?
我的目标是使用 crypto_Box_easy
/ crypto_Box_open_easy
例程,其中 Alice 和 Bob 每个人都有自己的标量/点,这些标量/点之前已经分别使用 crypto_core_ed25519_scalar_random
和 crypto_scalarmult_ed25519_base_noclamp
生成。
我不想使用 crypto_Box_keypair
,因为我想重复使用 Alice 和 Bob 已经拥有的现有密钥。
我尝试使用 crypto_sign_ed25519_sk_to_curve25519
/ crypto_sign_ed25519_pk_to_curve25519
例程将 Ed25519
标量/点转换为 x25519。但是解密失败,所以这似乎不是正确的方法。
这个例程似乎只在密钥对是用 crypto_sign_ed25519_keypair
生成时才起作用,不是 crypto_core_ed25519_scalar_random
和 crypto_scalarmult_ed25519_base_noclamp
。
我在这里包含两个片段。我展示的第一个 D 代码片段工作正常(您可以忽略序列化部分):
unittest
{
// alice: generate ed25519 key pair
ubyte[crypto_sign_ed25519_PUBLICKEYBYTES] ed25519_alice_pk;
ubyte[crypto_sign_ed25519_SECRETKEYBYTES] ed25519_alice_sk;
crypto_sign_ed25519_keypair(ed25519_alice_pk.ptr,ed25519_alice_sk.ptr);
// alice: convert ed25519 to x25519
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_alice_pk;
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_alice_sk;
crypto_sign_ed25519_sk_to_curve25519(x25519_alice_sk.ptr,ed25519_alice_sk.ptr);
crypto_sign_ed25519_pk_to_curve25519(x25519_alice_pk.ptr,ed25519_alice_pk.ptr);
// alice: generate ed25519 key pair
ubyte[crypto_sign_ed25519_PUBLICKEYBYTES] ed25519_bob_pk;
ubyte[crypto_sign_ed25519_SECRETKEYBYTES] ed25519_bob_sk;
crypto_sign_ed25519_keypair(ed25519_bob_pk.ptr,ed25519_bob_sk.ptr);
// alice: convert ed25519 to x25519
// secret key / point for x25519 encryption
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_bob_pk;
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_bob_sk;
crypto_sign_ed25519_sk_to_curve25519(x25519_bob_sk.ptr,ed25519_bob_sk.ptr);
crypto_sign_ed25519_pk_to_curve25519(x25519_bob_pk.ptr,ed25519_bob_pk.ptr);
static struct S
{
int x = 123;
}
S s;
const payload = s.serializefull();
ubyte[crypto_Box_NONCEBYTES] nonce;
randombytes_buf(nonce.ptr,nonce.length);
auto ciphertext_len = crypto_Box_MACBYTES + payload.length;
ubyte[] ciphertext = new ubyte[](ciphertext_len);
if (crypto_Box_easy(ciphertext.ptr,payload.ptr,payload.length,nonce.ptr,x25519_bob_pk.ptr,x25519_alice_sk.ptr) != 0)
assert(0);
ubyte[] decrypted = new ubyte[](payload.length);
if (crypto_Box_open_easy(decrypted.ptr,ciphertext.ptr,ciphertext_len,x25519_alice_pk.ptr,x25519_bob_sk.ptr) != 0)
assert(0);
S deserialized = deserializefull!S(decrypted);
assert(deserialized.x == s.x);
}
这是一个使用 crypto_core_ed25519_scalar_random
/ crypto_scalarmult_ed25519_base_noclamp
生成的密钥对的示例,但在解密过程中失败:
unittest
{
// alice: generate ed25519 key pair
ubyte[crypto_core_ed25519_BYTES] ed25519_alice_pk;
ubyte[crypto_core_ed25519_SCALARBYTES] ed25519_alice_sk;
crypto_core_ed25519_scalar_random(ed25519_alice_sk.ptr);
crypto_scalarmult_ed25519_base_noclamp(ed25519_alice_pk.ptr,ed25519_alice_pk.ptr);
// bob: generate ed25519 key pair
ubyte[crypto_core_ed25519_BYTES] ed25519_bob_pk;
ubyte[crypto_core_ed25519_SCALARBYTES] ed25519_bob_sk;
crypto_core_ed25519_scalar_random(ed25519_bob_sk.ptr);
crypto_scalarmult_ed25519_base_noclamp(ed25519_bob_pk.ptr,ed25519_bob_sk.ptr);
// bob: convert ed25519 to x25519
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_bob_pk;
ubyte[crypto_scalarmult_curve25519_BYTES] x25519_bob_sk;
crypto_sign_ed25519_sk_to_curve25519(x25519_bob_sk.ptr,x25519_bob_sk.ptr) != 0)
assert(0); // FAILS
S deserialized = deserializefull!S(decrypted);
assert(deserialized.x == s.x);
}
这些示例在其他方面是等效的。所以问题是,如果我只有一个使用 crypto_core_ed25519_scalar_random
和 crypto_scalarmult_ed25519_base_noclamp
生成的用于签名的密钥对,那么导出用于加密的密钥对的正确方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。