我为某些编程问题而道歉,但我想确保我正确地使用这个库加密。
我设法实现了ed25519-donna,除了哈希数据以进行签名。
据我所知,这是散列数据的函数:
void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);
但我无法弄清楚* hash是什么。我非常确定*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;
如何修改此代码以便ed25519_hash
能够正常运行?无论hash
和in
是unsigned char*
还是uint8_t*
,它的工作方式都相同。
对于uint8_t*
,我使用了以下代码:
uint8_t* hash;
const uint8_t* in = reinterpret_cast<const uint8_t*>(myString.c_str());
答案 0 :(得分:3)
uint8_t *hash
是调用函数后将包含结果哈希的缓冲区(unsigned char *)。
所以,你正在寻找一个需要3个参数(也称为参数)的函数:
uint8_t *
缓冲区,不,这是常规的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,这意味着你正在玩错误的函数。
使用库提供的功能。
您的问题让我想知道您是否向下滚动到the readme的“用法”部分,因为它完全回答了您的问题并告诉您要使用哪些功能。
为方便起见,请允许我指出您需要遵循的文档部分,以及使用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;
...
如你所见,它就在那里......只需按照文档说明。