c - 在 C 中不使用 openSSL 进行类似于 BN_hex2bn + BN_bn2bin 的转换
问题描述
我目前使用 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 期望的格式吗?这很复杂吗?
解决方案
目前尚不清楚您为什么要这样做,并且绝对不建议您自行实现转换函数(它们可能会停止对 OpenSSL 进行任何数量的内部更改),但如果您对它的外观感兴趣:
static int bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
{
int n;
size_t i, lasti, j, atop, mask;
BN_ULONG l;
/*
* In case |a| is fixed-top, BN_num_bytes can return bogus length,
* but it's assumed that fixed-top inputs ought to be "nominated"
* even for padded output, so it works out...
*/
n = BN_num_bytes(a);
if (tolen == -1) {
tolen = n;
} else if (tolen < n) { /* uncommon/unlike case */
BIGNUM temp = *a;
bn_correct_top(&temp);
n = BN_num_bytes(&temp);
if (tolen < n)
return -1;
}
/* Swipe through whole available data and don't give away padded zero. */
atop = a->dmax * BN_BYTES;
if (atop == 0) {
OPENSSL_cleanse(to, tolen);
return tolen;
}
lasti = atop - 1;
atop = a->top * BN_BYTES;
for (i = 0, j = 0, to += tolen; j < (size_t)tolen; j++) {
l = a->d[i / BN_BYTES];
mask = 0 - ((j - atop) >> (8 * sizeof(i) - 1));
*--to = (unsigned char)(l >> (8 * (i % BN_BYTES)) & mask);
i += (i - lasti) >> (8 * sizeof(i) - 1); /* stay on last limb */
}
return tolen;
}
推荐阅读
- rust - 使用 actix 启动计划任务并访问自己
- kubernetes - 无法通过 minikube 隧道访问应用程序
- java - 迭代器中每个项目的新线程
- javascript - 在另一个函数的参数中声明的函数的词法范围是什么
- python - PyTorch 错误 - 'numpy.ndarray' 对象没有属性 'relu'
- symfony - Symfony 4 Xdebug 不能使用 REST API
- javascript - 发送带有号码选择字段的组
- java - javax.validation.ConstraintValidator 中的 Guice 多绑定注入
- python - 我们如何在 pandas 数据框中具有已知索引的特定行中进行迭代?
- python - 使用 Pandas 进行网页抓取的 CSV 输出问题