加密代码如下:
密文:
看了一下一共有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为其他值同理
给出代码如下