C++ sizeof() 函数可以用来防止整数溢出吗?
Can the C++ sizeof() function be used to prevent integer overflows?
我正在构建计划用于密码学的数学函数。
如果代码容易受到攻击,您的算法就毫无用处。
缓冲区很容易防止溢出;但是整数呢?
我不会分享我的 Galois 函数,但这是我的常规加法函数之一:
/**/
private:
bool ERROR;
signed int ret;
void error(std::string msg){
ERROR = true;
std::cout<<"\n[-] "<<msg<<std::endl;
}
/**/
public:
signed int add(signed int a, signed int b){
if(sizeof(a) > sizeof(signed int) || sizeof(b) > sizeof(signed int) || sizeof(a+b) > sizeof(signed int)){
error("Integer overflow!");
ERROR = true;
ret = 0;
return ret;
}else{
ERROR = false;
ret = a + b;
return ret;
}
error("context failure");
ret = 0;
ERROR = true;
return ret;
}
if 条件是否足以防止恶意输入?如果没有,我将如何修复此漏洞?
根据其他答案,不,sizeof 不会防止您尝试执行的操作。它关心类型的字节宽度,而不是其他任何东西。
你问的是整数溢出,但你的例子有双倍。双打是浮点数,AFAIK 有明确的 "overflow" 原因。如果值超过最大值,您将得到 +INF,正无穷大。但是在那之前你会失去很多精度。浮点值不会回绕。
AFAIK,在当前相关的 C/C++ 标准中,没有办法可移植地检测无符号整数 "overflow"(定义明确),但是 gcc 和 clang 有内置函数来检测一个.您可以尝试预测无符号溢出,但最佳和最可移植的方法仍在激烈争论中。
有符号整数溢出是未定义的行为,这意味着实现在遇到它时可以自由地做任何它想做的事情。
如果您执意要推出自己的密码学against best practices,您应该仔细检查其他实现所做的事情并确保您理解原因。
还值得注意的是,在安全方面,integer/float 溢出与缓冲区溢出不同。
所以我找到了答案。
我决定使用以下 if 逻辑来防止整数溢出:
if((a >= 2000000000 || a <= -2000000000) ||
(b >= 2000000000 || b <= -2000000000) ||
((a+b) >= 2000000000 || (a+b) <= -2000000000)){
经过 运行 一些测试后,我能够确认整数循环回到负数。
由于我使用的是有限域,因此我预计程序的正常输入不会接近 200 万,同时还要确保处理溢出。
如果超出范围,退出。
~编辑:修复了逻辑错误
我正在构建计划用于密码学的数学函数。
如果代码容易受到攻击,您的算法就毫无用处。 缓冲区很容易防止溢出;但是整数呢?
我不会分享我的 Galois 函数,但这是我的常规加法函数之一:
/**/
private:
bool ERROR;
signed int ret;
void error(std::string msg){
ERROR = true;
std::cout<<"\n[-] "<<msg<<std::endl;
}
/**/
public:
signed int add(signed int a, signed int b){
if(sizeof(a) > sizeof(signed int) || sizeof(b) > sizeof(signed int) || sizeof(a+b) > sizeof(signed int)){
error("Integer overflow!");
ERROR = true;
ret = 0;
return ret;
}else{
ERROR = false;
ret = a + b;
return ret;
}
error("context failure");
ret = 0;
ERROR = true;
return ret;
}
if 条件是否足以防止恶意输入?如果没有,我将如何修复此漏洞?
根据其他答案,不,sizeof 不会防止您尝试执行的操作。它关心类型的字节宽度,而不是其他任何东西。
你问的是整数溢出,但你的例子有双倍。双打是浮点数,AFAIK 有明确的 "overflow" 原因。如果值超过最大值,您将得到 +INF,正无穷大。但是在那之前你会失去很多精度。浮点值不会回绕。
AFAIK,在当前相关的 C/C++ 标准中,没有办法可移植地检测无符号整数 "overflow"(定义明确),但是 gcc 和 clang 有内置函数来检测一个.您可以尝试预测无符号溢出,但最佳和最可移植的方法仍在激烈争论中。
有符号整数溢出是未定义的行为,这意味着实现在遇到它时可以自由地做任何它想做的事情。
如果您执意要推出自己的密码学against best practices,您应该仔细检查其他实现所做的事情并确保您理解原因。
还值得注意的是,在安全方面,integer/float 溢出与缓冲区溢出不同。
所以我找到了答案。
我决定使用以下 if 逻辑来防止整数溢出:
if((a >= 2000000000 || a <= -2000000000) ||
(b >= 2000000000 || b <= -2000000000) ||
((a+b) >= 2000000000 || (a+b) <= -2000000000)){
经过 运行 一些测试后,我能够确认整数循环回到负数。
由于我使用的是有限域,因此我预计程序的正常输入不会接近 200 万,同时还要确保处理溢出。
如果超出范围,退出。
~编辑:修复了逻辑错误