gpt4 book ai didi

c - 在 C 中不使用 openSSL 进行类似于 BN_hex2bn + BN_bn2bin 的转换

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:08 27 4
gpt4 key购买 nike

我目前使用 openSSL 将值从加密字符串转换为我认为的二进制数组。然后我解密这个“数组”(传递给 EVP_DecryptUpdate)。我像这样进行转换:

    BIGNUM *bnEncr = BN_new();
if (0 == BN_hex2bn(&bnEncr, encrypted)) { // from hex to big number
printf("ERROR\n");
}
unsigned int numOfBytesEncr = BN_num_bytes(bnEncr);
unsigned char encrBin[numOfBytesEncr];
if (0 == BN_bn2bin(bnEncr, encrBin)) { // from big number to binary
printf("ERROR\n");
}

然后我将 encrBin 传递给 EVP_DecryptUpdate 并进行解密。

我在我的代码中的很多地方都这样做,现在想编写我自己的 C 函数,将十六进制转换为二进制数组,然后我可以将其传递给 EVP_DecryptUpdate。我试了一下,将加密的十六进制字符串转换为 0 和 1 的数组,但事实证明 EVP_DecryptUpdate 无法使用它。根据我在网上找到的信息,BN_bn2bin“创建了一个真正的二进制表示(即位序列)。更具体地说,它创建了数字的大端表示。”所以这不仅仅是一个 0 和 1 的数组,对吧?

有人能解释一下我如何在 C 中自己进行十六进制->(真正的)二进制转换,这样我就能得到 EVP_DecryptUpdate 期望的格式吗?这很复杂吗?

最佳答案

BN_bn2bin "creates a representation that is truly binary (i.e. a sequence of bits). More specifically, it creates a big-endian representation of the number." So this is not just an array of 0s and 1s, right?

这里提到的位序列表示为一个字节数组。这些字节中的每一个都包含 8 位,这可以解释为“0 和 1 的数组”。它不是“值为 0 或 1 的整数数组”,如果这是您要问的。

由于您不清楚 BN_bn2bin() 的工作原理,因此仅分析代码片段的最终结果会有所帮助。您可以这样做(省略任何错误检查):

#include <stdio.h>
#include <openssl/bn.h>

int main(
int argc,
char **argv)
{
const char *hexString = argv[1];

BIGNUM *bnEncr = BN_new();
BN_hex2bn(&bnEncr, hexString);
unsigned int numOfBytesEncr = BN_num_bytes(bnEncr);
unsigned char encrBin[numOfBytesEncr];
BN_bn2bin(bnEncr, encrBin);
fwrite(encrBin, 1, numOfBytesEncr, stdout);
}

这会将 encrBin 的内容输出到标准输出,这绝不是一件好事,但是您可以通过 hexdump 之类的工具对其进行管道传输,或者将其重定向到一个文件,以便使用十六进制编辑器进行分析。它看起来像这样:

$ ./bntest 74162ac74759e85654e0e7762c2cdd26 | hexdump -C
00000000 74 16 2a c7 47 59 e8 56 54 e0 e7 76 2c 2c dd 26 |t.*.GY.VT..v,,.&|
00000010

或者,如果您确实想查看那些 0 和 1:

$ ./bntest  74162ac74759e85654e0e7762c2cdd26 | xxd -b -c 4
00000000: 01110100 00010110 00101010 11000111 t.*.
00000004: 01000111 01011001 11101000 01010110 GY.V
00000008: 01010100 11100000 11100111 01110110 T..v
0000000c: 00101100 00101100 11011101 00100110 ,,.&

这表明你的问题

Can someone explain how I can make the hex->(truly) binary conversion myself in C, so I would get the format that EVP_DecryptUpdate expects? Is this complicated?

与 SO 问题基本相同 How to turn a hex string into an unsigned char array? ,就像我一样commented .

关于c - 在 C 中不使用 openSSL 进行类似于 BN_hex2bn + BN_bn2bin 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53770764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com