Hash 如何与ed25519 donna进行哈希运算

Hash 如何与ed25519 donna进行哈希运算,hash,ed25519,Hash,Ed25519,很抱歉,我问了一些编程问题,但我想确定我正确地使用了这个库的密码 除了对数据进行哈希处理以获得签名之外,我已经成功地实现了 据我所知,这是散列数据的函数: void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); 但我不知道散列是什么。我相当确定*in和inlen是要散列的数据及其长度 这是SHA512特有的吗 一个人怎么能和ed25519 donna混在一起 程序挂起 我已经使用ed25519 donna mast

很抱歉,我问了一些编程问题,但我想确定我正确地使用了这个库的密码

除了对数据进行哈希处理以获得签名之外,我已经成功地实现了

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

void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);
但我不知道散列是什么。我相当确定
*in
inlen
是要散列的数据及其长度

这是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;   
“…但我搞不懂散列是什么。”
uint8_t*hash
是缓冲区(unsigned char*),它将在调用函数后包含结果hash

因此,您看到的函数需要3个参数(也称为参数):

  • 一个
    uint8\u t*
    缓冲区,用于保存生成的散列
  • 要散列的输入数据
  • 要散列的输入数据的长度
  • “这是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混在一起?” 通过使用库提供的功能

    您的问题让我想知道您是否向下滚动到的“用法”,因为它完全回答了您的问题,并告诉您要使用哪些函数

    为方便起见,让我向您指出您需要遵循的文档部分,以及您需要使用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我想我已经发现了您的问题:您在尝试执行的操作中使用了错误的函数。我已经更新了我的答案,以便向您指出您明显遗漏的文档部分。;)@是的。您使用的函数仅在您未链接到OpenSSL时使用(更好:实现)。但是,如果您确实链接到OpenSSL——您正在这样做——您可以忘记这些琐事,享受库为您包装的功能(包括散列)。例如
    ed25519符号(消息、消息、密钥、主键、签名)
    将接收消息并将签名放入
    ed25519_签名sig。不需要进一步的步骤…这是使用此类库的原因之一。;)
    
    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;