web3中的SHA3
使用keccak-256哈希算法,来计算哈希值,注意这不是标准的SHA3-256函数。
具体的实现如下图所示,需要先转为字节数组
调用:
var hashOfHash = web3.sha3("0000000000000000000000000000000000000000000000000000000000000002", {encoding: 'hex'});
console.log(hashOfHash);
openssl实现
版本:openssl1.1.1
转换为字节数组
void hex2bytearray(char s[], unsigned char bits[])
{
int n = 0;
for (int i = 0; s[i]; i += 2) {
if (s[i] >= 'a' && s[i] <= 'f')
bits[n] = s[i] - 'a' + 10;
else bits[n] = s[i] - '0';
if (s[i + 1] >= 'a' && s[i + 1] <= 'f')
bits[n] = (bits[n] << 4) | (s[i + 1] - 'a' + 10);
else bits[n] = (bits[n] << 4) | (s[i + 1] - '0');
n++;
}
}
openssl中SHA3和以太坊的差异,以及以下结构参考:https://blog.csdn.net/hnlylyb/article/details/81335862
struct EVP_MD_CTX_t {
const EVP_MD *digest;
ENGINE *engine; /* functional reference if 'digest' is
* ENGINE-provided */
unsigned long flags;
void *md_data;
/* Public key context for sign/verify */
EVP_PKEY_CTX *pctx;
/* Update function: usually copied from EVP_MD */
int(*update) (EVP_MD_CTX *ctx, const void *data, size_t count);
} /* EVP_MD_CTX */;
struct KECCAK1600_CTX {
uint64_t A[5][5];
size_t block_size; /* cached ctx->digest->block_size */
size_t md_size; /* output length, variable in XOF */
size_t num; /* used bytes in below buffer */
unsigned char buf[1600 / 8 - 32];
unsigned char pad;
};
之后调用即可
char *data1 = (char *)"0000000000000000000000000000000000000000000000000000000000000002";
unsigned char data[32];
hex2bytearray(data1, data);
unsigned int size = sizeof(data);
const EVP_MD* evp_md = EVP_sha3_256();
EVP_MD_CTX *evp_md_ctx = EVP_MD_CTX_new();
EVP_DigestInit(evp_md_ctx, evp_md);
KECCAK1600_CTX* keccak256 = reinterpret_cast<KECCAK1600_CTX*>((reinterpret_cast<EVP_MD_CTX_t*>(evp_md_ctx))->md_data);
keccak256->pad = 0x01;
EVP_DigestUpdate(evp_md_ctx, data, size);
unsigned int * len = new unsigned[10];
unsigned char* result = (unsigned char*)malloc(32);
EVP_DigestFinal(evp_md_ctx, result, &size);
for (int i = 0; i < 32; i++) //16进制输出
{
printf("%02x", (int)result[i]);
}