Python 如何在C中使用openssl bignum将字符串转换为长字符串?

Python 如何在C中使用openssl bignum将字符串转换为长字符串?,python,c,openssl,cryptography,long-integer,Python,C,Openssl,Cryptography,Long Integer,我正在尝试将此函数从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) 这根绳子很长。我相信结果

我正在尝试将此函数从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位。我试图使用openssl bn结构将其移植到C,但似乎无法获得正确的输出。以下是python函数的每个步骤的输出,以字符串表示形式打印:

bytes: b'B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371'

a2b_hex: b'\xb1\x0b\x8f\x96\xa0\x80\xe0\x1d\xde\x92\xde^\xae]T\xecR\xc9\x9f\xbc\xfb\x06\xa3\xc6\x9aj\x9d\xcaR\xd2;a`s\xe2\x86u\xa2=\x18\x988\xef\x1e.\xe6R\xc0\x13\xec\xb4\xae\xa9\x06\x11#$\x97\\<\xd4\x9b\x83\xbf\xac\xcb\xdd}\x90\xc4\xbdp\x98H\x8e\x9c!\x9asrN\xff\xd6\xfa\xe5dG8\xfa\xa3\x1aO\xf5[\xcc\xc0\xa1Q\xaf_\r\xc8\xb4\xbdE\xbf7\xdf6\\\x1ae\xe6\x8c\xfd\xa7mM\xa7\x08\xdf\x1f\xb2\xbc.JCq'

bytes_to_long: 124325339146889384540494091085456630009856882741872806181731279018491820800119460022367403769795008250021191767583423221479185609066059226301250167164084041279837566626881119772675984258163062926954046545485368458404445166682380071370274810671501916789361956272226105723317679562001235501455748016154805420913

如何将bn转换为与python相同的长字符串?

创建一个整数值0。查看字符串最左边的字符,并向运行的总整数中添加一个值,该值等于该字符表示的十进制值(0-15)。然后将你的跑步总数乘以16,然后移动到下一个字母/数字。一直这样做,直到十六进制字符串中的最后一个位置,然后再乘以16


我不太清楚这是否是您的代码试图做的。

根据OpenSSL手册:

int BN_print_fp(文件*fp,常量BIGNUM*a)

BN_print()和BN_print_fp()将a的十六进制编码写入BIO或文件fp,负数以“-”开头

您需要的是:

char*BN_bn2dec(const BIGNUM*a)

BN_bn2hex()和BN_bn2dec()返回可打印字符串,分别包含。对于负数,字符串的前导是“-”。以后必须使用OPENSSL_free()释放该字符串


您可以使用OpenSSL Bignum函数:

int BN_bn2bin(const BIGNUM *a, unsigned char *to);
BN_bn2bin将a的绝对值转换为大端形式,并将其存储到。必须指向内存的BN_num_字节(a)字节

char *BN_bn2hex(const BIGNUM *a);
char *BN_bn2dec(const BIGNUM *a);
BN_bn2hex()和BN_bn2dec()返回可打印字符串,分别包含。对于负数,字符串的前导是“-”。以后必须使用OPENSSL_free()释放该字符串

反之亦然,这些函数是(将char*转换为BIGNUM数据结构):


这成功了!谢谢。当我将其转换为十进制时,它与python字符串匹配。
int BN_bn2bin(const BIGNUM *a, unsigned char *to);
char *BN_bn2hex(const BIGNUM *a);
char *BN_bn2dec(const BIGNUM *a);
BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
int BN_hex2bn(BIGNUM **a, const char *str);
int BN_dec2bn(BIGNUM **a, const char *str);