[Zer0pts2020]ROR1

加密代码如下:

密文:

看了一下一共有367行密文,记密文为c,即c1.......c367已知

根据加密代码:

ci = (ror(m,i,m.bit_length()) ^ e)%N  即 ci = k * N + (ror(m,i,m.bit_length()) ^ e)  ,ci表示第i次的密文

 

可以看到模数N = 2 ^ randint * (3 ^ randint) * (7 ^ randint),也就是说N是2的倍数即N是一个偶数

我们知道在二进制中,一个数是偶数的话那么它的二进制值表达式的最后一位一定是0,如果是奇数,那么其二进制值表达式中最后一位一定是1。

现在 k * N 一定是偶数,所以ci的奇偶性取决于 (ror(m,i,m.bit_length()) ^ e) . 现在我们已知ci,如果ci最后一位是0即ci是偶数,那么(ror(m,i,m.bit_length()) ^ e)的最后一位也一定是0,反之则是1。

当 i =0时,(ror(m,i,m.bit_length()) ^ e) = m|0=m 即c0的最后一位是m的倒数第一位,我们可以求出m的最后一位来。

当i = 1时,(ror(m,i,m.bit_length()) ^ e) = (m >>1)| ((m&1)<<366).  这个数的最后一位一定是m>>1的最后一位,因为((m&1)<<366)的最后一位是0 (这里左移低位补0),那么整体(m >>1)| ((m&1)<<366)的最后一位的值取决于m>>1的最后一位也就是m的倒数第二位(任何数 或 0 等于自身),所以我们就这样得到了m的倒数第二位,当i为其他值同理

给出代码如下

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值