c语言字符串转long型,如何使用C语言中的openssl bignum将字符串转换为long?

我试图将这个函数从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吗?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值