如何在openssl的BIGNUM中使用负数?

用户名

我想要以下Java代码的C ++版本。

BigInteger x = new BigInteger("00afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d", 16);
BigInteger y = x.multiply(BigInteger.valueOf(-1));

//prints y = ff5028d4a7ca52dd15a297d860053f49ad83e54f04ce0e19b908d728a342c519a3
System.out.println("y = " + new String(Hex.encode(y.toByteArray())));

这是我尝试解决的方法。

BIGNUM* x = BN_new();
BN_CTX* ctx = BN_CTX_new();
std::vector<unsigned char> xBytes = hexStringToBytes(“00afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d");
BN_bin2bn(&xBytes[0], xBytes.size(), x);

BIGNUM* negative1 = BN_new();
std::vector<unsigned char> negative1Bytes = hexStringToBytes("ff");
BN_bin2bn(&negative1Bytes[0], negative1Bytes.size(), negative1);

BIGNUM* y = BN_new();
BN_mul(y, x, negative1, ctx);

char* yHex = BN_bn2hex(y);
std::string yStr(yHex);
//prints y = AF27542CDD7775C7730ABF785AC5F59C299E964A36BFF460B031AE85607DAB76A3
std::cout <<"y = " << yStr << std::endl;

(忽略了情况。)我做错了什么?如何获取我的C ++代码以输出正确的值“ ff5028d4a7ca52dd15a297d860053f49ad83e54f04ce0e19b908d728a342c519a3”。我还尝试通过执行BN_set_word(negative1,-1)来设置negative1,但这也给了我错误的答案。

MM

BN_set_negative功能设置一个负数。

afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d实际是-afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d,在相同的方式,-2就是负2

ff5028d4a7ca52dd15a297d860053f49ad83e54f04ce0e19b908d728a342c519a3 是一个很大的正数。

在Java中看到此数字的原因是由于该toByteArray调用。根据其文档,它选择最小字段宽度,该宽度为整数个字节,并且还可以保留负数的二进制补码表示形式。

换句话说,通过toByteArray对当前具有1个符号位和256个值位的数字使用该函数,最终将得到264位的字段宽度。但是7,例如,如果您的负数是第一个小字节,而不是a,那么(根据本文档-实际上我没有尝试过),您将获得256位的字段宽度(即8028d4...,不是)ff8028d4

00您在代码中使用的前导在OpenSSL BN中微不足道。我不确定它在BigInteger中是否有意义,尽管该构造函数的文档说:“字符串表示形式包含一个可选的减号或加号,后跟指定基数中的一个或多个数字的序列。” 因此,它接受减号的事实表明,如果不存在减号,则即使输入的最高有效位已设置,输入也将被视为较大的正数。(希望Java程序员可以帮我清除这段内容)。

确保牢记大负值与通过模运算对该负值进行模运算而获得的大正数之间的区别,例如的输出toByteArray


因此,您的问题确实是:Openssl BN是否具有模仿BigInteger.toByteArray()行为的函数?

我不知道是否存在这样的功能(BN库的IMHO文档相当差,而且我从未听说过它在OpenSSL之外使用,尤其是在C ++程序中)。我不希望这样,因为toByteArray的行为有点怪异。在任何情况下,所有BN输出功能似乎都是使用符号幅度格式而不是二进制补码格式输出的。

但是要复制该输出,可以将2^256添加2^264到大的负数,然后执行BN_bn2hex在这种特殊情况下,请添加2^264。通常,您必须测量要存储的数字的当前位长,并将指数四舍五入到最接近的8的倍数。

或者,您甚至可以以符号幅度格式输出(使用BN_bn2hexBN_bn2mpi),然后通过反转每个半字节并确定起点来进行迭代!

注意 您要使用OpenSSL BN是否有任何特定原因?有很多选择

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在openssl的BIGNUM中使用负数?

来自分类Dev

如何在Swift中使用负数?

来自分类Dev

如何在chartist.js中使用负数

来自分类Dev

如何在random.randrange中使用负数

来自分类Dev

如何在pyOpenSSL中使用最新的openssl库?

来自分类Dev

如何在FreeBSD的Python 3.7中使用OpenSSL?

来自分类Dev

如何在flask中使用openssl(在“Flask Web Development”中)

来自分类Dev

尽快使用OpenSSL的BIGNUM分割数字

来自分类Dev

如何在openssl中使用特定的输入数字生成rsa密钥?

来自分类Dev

如何在jni中使用openssl返回rsa加密字符串

来自分类Dev

如何在NodeJS中使用openssl-wrapper生成RSA密钥?

来自分类Dev

如何在AES_set_encrypt_key中的openssl中使用自定义密钥

来自分类Dev

如何在OpenSSL中使用p-256和SHA256获得ECSDA?

来自分类Dev

如何在openssl中使用特定的输入数字生成rsa密钥?

来自分类Dev

如何在PKCS#11模块上使用私钥,而不是在OpenSSL中使用私钥文件进行相互认证?

来自分类Dev

存储OpenSSL BIGNUM操作结果

来自分类Dev

在OpenSSL中定义常量BIGNUM

来自分类Dev

OpenSSL - BIGNUM 检查问题

来自分类Dev

C-重新编码malloc()如何检测调用中使用的负数大小?

来自分类Dev

C-重新编码malloc()如何检测调用中使用的负数大小?

来自分类Dev

如何在bash中乘以负数

来自分类Dev

JS:如何在JavaScript中添加负数

来自分类Dev

如何在Ruby中解析负数?

来自分类Dev

JS:如何在JavaScript中添加负数

来自分类Dev

如何在MySQL中不显示负数?

来自分类Dev

您如何在JavaScript中乘以负数?

来自分类Dev

如何在if循环中排除负数?

来自分类Dev

如何在C#中减去负数?

来自分类Dev

如何在Ruby中解析负数?

Related 相关文章

热门标签

归档