在C++中实现 CTR 加密模式时,CTR 加上 64 位整数



我正在尝试使用库 BigInteger 将 128 位二进制字符串(如 1101)转换为 int(如 13)。由于 128 位数字可能超过基元类型的大小,因此我尝试了 BigInteger 库。但是我不能将其与内置的锡双精度类型一起使用,因为双精度和 BigInteger 之间的类型转换错误:

BigInteger binStringToInt(string s){
BigInteger r = 0;
for (int i = s.length() - 1; i >= 0; i--){
int hat = s.length() - i - 1;
int num = s.at(i) - 48;
r += num* pow(2, hat);
}
return r;
}

也不能使用它:

r += num* (long)pow(2, hat);

这种方式可以修复类型转换错误,但是当帽子很大时,pow() 将超过长的范围。
如何让它工作?

BigInteger lib 中没有幂函数,你可以使用:

BigInteger binStringToInt(string s){
BigInteger r = 0;
for (int i = s.length() - 1; i >= 0; i--){
int hat = s.length() - i - 1;
int num = s.at(i) - 48;
BigInteger digitValue = 2;
for (int powIdx = 1; powIdx < hat; powIdx++)
digitValue *= 2;
r += num * digitValue;
}
return r;
}

如果您事先知道您将处理 128 位数字,则可能有优化的余地。(例如,将数字值初始化为循环外的pow(2, 128),然后在每次迭代中除以 2)。

但是,你也可以做的(可能是一个更好的实现)是为 BigIntegers 实现一个位移运算符,这将允许你随时构建你的数字,甚至是直接设置位的按位或运算符。

最新更新