侧信道攻击在密码中一点应用
1416621359078770 发表于 四川 CTF 888浏览 · 2025-05-29 08:35

侧信道攻击在密码中应用

侧信道攻击(Side-Channel Attack,简称 SCA)是一种不直接攻击密码算法本身数学结构,而是通过分析加密设备在执行加密运算时泄露出的物理信息来推测密钥的攻击方式。

这里讨论时间的侧信道攻击,以sage中一个is_prime()函数为例,它就判断一个数是不是素数,返回true/flase,去看它是怎么实现的

ret = n.is_prime()对于整数是调用自身方法,再次查看code

mpz_fits_ulong_p()判断是否可以安全地转换为一个 无符号长整型(unsigned long),而不会发生溢出或精度丢失。返回true/flase 这对小于2^64的数,给一个分支判断是否是不是素数,这里先判断奇偶,然后小于一千的奇数(用一个list保存对应的是不是素数),大于1000的用pari_is_prime()判断是不是素数,这里对小于1000的素数判断时间会较小于大于1000的素数 测试代码

测试结果
image.png


分析数如果大于2^64(即超过unsigned long的精度),会判断proof.arithmetic(),一般默认true
image.png


分析pari的素数测试代码

查看代码可知isprime()函数要过两个判断,对于第一个判断,是否有小于103的小素因子,对于第二个判断进行正式复合的素性证明(可能耗时比较长) 测试代码

image.png


由此我们可以利用is_prime()函数判断一个数有小于103的因子,或者小于1000(这个几乎不能利用)

以jqctf2025 onelinecrypto 为例 题目描述

这个题就是利用is_prime()函数判断一个数有小于103的因子, 我们可以操控flag^input_numinput_num,这个以为这可以在高于flag的位任意构造,所以所以可以利用这个使得可以(flag^input_num)可以覆盖一个小素数(p<103,p!=2)的完全剩余系,每个进行is_prime()判断,时间短的有(flag^input_num)%p==0input_num已知,则flag=-input_num%p(这里是因为他们input_num只取了高于flag的位,有flag^input_num=flag+input_num),遍历小p,crt,然后爆破得到结果。

虽然有小于103因子的数会快速出结果,但有时侯(还挺多)没有小于103因子的数也能快速出结果,则在每个剩余类进行爆破,只有正确(即(flag+input_num)%p==0)的没有长时间响应,由此一个个排除结果,然得到flag=-input_num%p

exp:


0 条评论
某人
表情
可输入 255