我试图将这个函数从Python移植到C:import binascii
from Crypto.Util.number import bytes_to_long
# converts from a string to a long
def _strtoLong(s):
s = bytes("".join(s.split()), "UTF-8")
s = binascii.a2b_hex(s)
return bytes_to_long(s)
这根绳子很长。结果是2048位。我试图使用opensslbn结构将其移植到C,但似乎无法获得正确的输出。以下是python函数的每个步骤的输出,打印为字符串表示:
^{pr2}$
在C中我正在做:#include
#include
#include
#include
#include
#include
int char2int(unsigned char input)
{
if(input >= '0' && input <= '9')
return input - '0';
if(input >= 'A' && input <= 'F')
return input - 'A' + 10;
if(input >= 'a' && input <= 'f')
return input - 'a' + 10;
return -1;
}
// This function assumes src to be a zero terminated sanitized string with
// an even number of [0-9a-f] characters, and target to be sufficiently large
void hex2bin(const unsigned char* src, unsigned char* target)
{
while(*src && src[1])
{
*(target++) = char2int(*src)*16 + char2int(src[1]);
src += 2;
}
}
int main()
{
unsigned char buf[512] = "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C6"
"9A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C0"
"13ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD70"
"98488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0"
"A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708"
"DF1FB2BC2E4A4371";
unsigned char P[2049], val[256];
int i;
int len = 256;
for(i=0; i
P[i] = buf[i];
}
fprintf(stderr, "\nbytes=%s\n", P);
hex2bin(P, val);
fprintf(stderr, "\nhex2bin= ");
for(i=0; i
fprintf(stderr, "%02x", val[i]);
fprintf(stderr, "\n");
BIGNUM *bn = BN_new();
BN_bin2bn(val, (int)len/2, bn);
fprintf(stderr, "\nbn=");
BN_print_fp(stdout, bn);
char *str = BN_bn2hex(bn);
printf("\n\nbn2hex: %s\n", str);
free(str);
BN_free(bn);
return 0;
}
这是它打印出来的:matthew@matthew-HP-15-Notebook-PC:~/Desktop/crypto/prog$ make
clang -Wall -I../tomsfastmath/src/headers/ -I../openssl/include main.c ../tomsfastmath/libtfm.a ../openssl/libcrypto.a -o bignum
matthew@matthew-HP-15-Notebook-PC:~/Desktop/crypto/prog$ ./bignum
bytes=B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371
hex2bin= b10b8f96a080e01dde92de5eae5d54ec52c99fbcfb06a3c69a6a9dca52d23b616073e28675a23d189838ef1e2ee652c013ecb4aea906112324975c3cd49b83bfaccbdd7d90c4bd7098488e9c219a73724effd6fae5644738faa31a4ff55bccc0a151af5f0dc8b4bd45bf37df365c1a65e68cfda76d4da708df1fb2bc2e4a4371
bn=B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371
bn2hex: B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371
有什么办法把bn转换成和python一样的long吗?在