我正在构建计划用于密码学的数学函数。
如果代码容易受到攻击,则您的算法无用。 缓冲区很容易防止溢出。但是整数呢?
我不会共享我的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是否足以阻止恶意输入?如果没有,我将如何解决此漏洞?
答案 0 :(得分:2)
根据其他答案,不,sizeof不能防止您尝试执行的操作。它关心类型的字节宽度,而不关心其他任何内容。
您正在询问整数溢出,但是您的示例有两倍。双打是浮点,并且AFAIK具有明确定义的“溢出”原因。如果值超过最大值,则将得到+ INF,正无穷大。但是在那之前,您将损失很多精度。浮点值不会环绕。
AFAIK,在当前的相关C / C ++标准中,没有办法可移植地检测无符号整数“溢出”(定义明确),但是gcc和clang具有内置函数来检测一个。您可以尝试预测无符号溢出,但是最好和最可移植的方法仍在激烈争论。
有符号整数溢出是未定义的行为,这意味着实现在遇到它时可以自由地执行其想要的任何事情。
如果您对使用自己的加密技术against best practices感到迷茫,则应仔细检查其他实现方式,并确保理解原因。
值得注意的是,在安全方面,整数/浮点溢出与缓冲区溢出并不相同。
答案 1 :(得分:0)
所以我找到了答案。
我决定使用以下if逻辑来防止整数溢出:
if((a >= 2000000000 || a <= -2000000000) ||
(b >= 2000000000 || b <= -2000000000) ||
((a+b) >= 2000000000 || (a+b) <= -2000000000)){
运行一些测试后,我能够确认整数循环回到负数。
由于我使用的是有限域,因此可以期望程序的正常输入不会接近200万,同时还要确保能够处理溢出。
如果超出范围,请退出。
〜edit:固定逻辑错误