可以使用C ++ sizeof()函数来防止整数溢出吗?

时间:2018-08-24 11:57:00

标签: c++ linux security integer-overflow

我正在构建计划用于密码学的数学函数。

如果代码容易受到攻击,则您的算法无用。 缓冲区很容易防止溢出。但是整数呢?

我不会共享我的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是否足以阻止恶意输入?如果没有,我将如何解决此漏洞?

2 个答案:

答案 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:固定逻辑错误