【问题标题】:How to hash with ed25519-donna如何使用 ed25519-donna 进行哈希处理
【发布时间】:2014-02-24 21:36:03
【问题描述】:

对于提出一些编程问题,我深表歉意,但我想确保我以加密方式正确使用了这个库。

我已经设法实现了ed25519-donna,除了对签名数据进行哈希处理。

据我所知,这是散列数据的函数:

void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);

但我不知道 *hash 是什么。我相当确定*ininlen 是要散列的数据及其长度。

它是 SHA512 特有的吗?

如何使用 ed25519-donna 进行哈希计算?


程序挂起

我已使用 ed25519-donna-master/ed25519.o 和 OpenSSL 标志 -lssl -lcrypto 进行编译。密钥生成、签名和验证功能按预期工作。

它运行没有错误,但应用程序挂在这些线上,并且核心没有以 100% 运行,所以我认为它不是忙于处理:

extern "C"
{
  #include "ed25519-donna-master/ed25519.h"
  #include "ed25519-donna-master/ed25519-hash.h"
}
#include <openssl/rand.h>

unsigned char* hash;
const unsigned char* in = convertStringToUnsignedCharStar( myString );
std::cout << in << std::endl;
std::cout << "this is the last portion output and 'in' outputs correctly" << std::endl;
ed25519_hash(hash, in, sizeof(in) );
std::cout << hash << std::endl;
std::cout << "this is never output" << std::endl;   

如何修改此代码以使ed25519_hash 可以正常工作?无论hashinunsigned char* 还是uint8_t*s,它的工作方式都是一样的。

对于uint8_t*,我使用了这个代码:

uint8_t* hash;
const uint8_t* in = reinterpret_cast<const uint8_t*>(myString.c_str());

【问题讨论】:

    标签: hash ed25519


    【解决方案1】:

    “……但我不知道 *hash 是什么。”

    uint8_t *hash 是缓冲区(无符号字符*),它将包含您调用函数后生成的哈希值。

    所以,您正在查看一个需要 3 个参数(也称为参数)的函数:

    1. 一个uint8_t * 缓冲区来保存生成的哈希,
    2. 要散列的输入数据,
    3. 要散列的输入数据的长度。

    “它是 SHA512 特有的吗?”

    不,它是常规的 C 源代码。但是我认为您对文档有些困惑。它指出……

    If you are not compiling against OpenSSL, you will need a hash function.
    …
    To use a custom hash function, use -DED25519_CUSTOMHASH
    when compiling ed25519.c and put your custom hash implementation
    in ed25519-hash-custom.h. The hash must have a 512bit digest and
    implement
    …
    void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);
    

    因此,除非您不针对 OpenSSL 进行编译并实现自己的哈希函数,否则您将不需要此函数。查看您的代码,您正在针对 OpenSSL 进行编译,这意味着您正在使用错误的函数。

    “如何使用 ed25519-donna 进行哈希计算?”

    通过使用库提供的功能。

    您的问题让我想知道您是否向下滚动到the readme 的“Usage”部分,因为它完全回答了您的问题并告诉您要使用哪些功能。

    为了您的方便,让我指出您需要遵循的文档部分,以及在哪里找到您需要使用 ed25519-donna 进行散列、签名、验证等的函数:

    要使用代码,请链接到 ed25519.o -mbits 和:

    #include "ed25519.h"
    

    在使用 OpenSSL 时添加 -lssl -lcrypto(有些系统没有 需要-lcrypto?这可能是反复试验)。

    要生成私钥,只需从安全加密源生成 32 个字节:

    ed25519_secret_key sk;
    randombytes(sk, sizeof(ed25519_secret_key));
    

    要生成公钥:

    ed25519_public_key pk;
    ed25519_publickey(sk, pk);
    

    要签署消息:

    ed25519_signature sig;
    ed25519_sign(message, message_len, sk, pk, signature);
    

    验证签名:

    int valid = ed25519_sign_open(message, message_len, pk, signature) == 0;
    

    批量验证签名:

    const unsigned char *mp[num] = {message1, message2..}
    size_t ml[num] = {message_len1, message_len2..}
    const unsigned char *pkp[num] = {pk1, pk2..}
    const unsigned char *sigp[num] = {signature1, signature2..}
    int valid[num]
    
    /* valid[i] will be set to 1 if the individual signature was valid, 0 otherwise */
    int all_valid = ed25519_sign_open_batch(mp, ml, pkp, sigp, num, valid) == 0;
    

    如您所见,一切尽在其中……只需按照文档进行操作即可。

    【讨论】:

    • @Gracchus 我已经将它标记为版主将其迁移到 StackOverflow ......我会保持原样。
    • @Gracchus 我想我已经发现了您的问题:您尝试执行的操作使用了错误的功能。我已经更新了我的答案,以将您指向您显然错过的文档部分。 ;)
    • @Gracchus 是的。您正在使用的功能仅在您未链接到 OpenSSL 时使用(更好:已实现)。但是,如果您确实链接到 OpenSSL(您正在这样做),您可以忘记这些细节并享受库为您包装的功能(包括散列)。例如ed25519_sign(message, message_len, sk, pk, signature); 将接收消息并将签名放入ed25519_signature sig;。不需要进一步的步骤……这是使用这样一个库的原因之一。 ;)
    猜你喜欢
    • 2012-05-06
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多