看到隔壁讨论密码学,乘机问一个折腾几天没看懂的问题

查看 57|回复 6
作者:MozzieW   
下面是简化的代码,描述的是解密的过程,我想知道对应加密的过程是怎么样的,没看懂这种逻辑的还原原理是什么
uint32_t descrypt(byte[] block, byte[] key) {
        // table_s5678 都是长度为 256 的四字节数组
    unsigned long table_s5[] = {0x21aa8423, 0x2fa1892a, 0x3dbc9e31, 0x33b79338,...};
    unsigned long table_s6[] = {0x5ee7493, 0xce07f9e, 0x17f26289, 0x1efc6984,...};
    unsigned long table_s7[] = {0xb33a6e73, 0xbe336078, 0xa9287265, 0xa4217c6e,...};
    unsigned long table_s8[] = {0xb4469bf0, 0xbf4b92fe, 0xa25c89ec, 0xa95180e2, ...}
    uint32_t ptr1 = 0;
    uint32_t ptr2 = 0;
    uint32_t ptr3 = 0;
    uint32_t ptr4 = 0;
    uint32_t ab;
   
    // 注意这是解密的逻辑
    // block 是明文,key 是密钥,两者各个字节先异或,然后在查表转换为四个字节的值
    ptr1 = table_s5[block[3] ^ key0[3]];
    ptr2 = table_s6[block[2] ^ key0[2]];
    ptr3 = table_s8[block[0] ^ key0[0]];
    ptr4 = table_s7[block[1] ^ key0[1]];
    // 面就是我不懂的地方:ab 是四个 long 的异或,怎么还原回四个 ptr ,如果不还原,对应加密又是怎么处理的
    ab = ptr1 ^ ptr2 ^ ptr3 ^ ptr4;
    return ab;
我对比了 AES 、DES 等算法里面关于 S 盒的实现,没有发现这么复杂的,主要就是一个自己转四个字节,四个字节转异或,怎么也没弄懂原理是什么。如果有知道的请指教。
更多:这个代码其实是苹果 FairPlay 的一部分,完整代码可以看这里( cycle 方法):
https://github.com/FDH2/UxPlay/blob/c4fb40ee31b61b1b3b5ae406900af72edac2ca47/lib/playfair/omg_hax.c
EndlessMemory   
扔给 GPT
0o0O0o0O0o   
这种项目都是逆向得来的,可能是从高度混淆的程序的反编译结果中摸索提取出来的,可能是常见算法的一个变种,可能是白盒加密,我觉得实在没有必要搞清楚它是什么。
0o0O0o0O0o   
而且你看你发的这个链接里的注释...
// This looks right to me, at least for decrypt_kernel
// round is 0..8?
// This COULD just be Rijndael key expansion, but with a different set of S-boxes
// This MIGHT just be AES, or some variant thereof.
MozzieW
OP
  
@EndlessMemory
这个我已经看了好几天了,不是伸手就问。
GPT 不行,给的实现都是照炒代码,匹配不上的。
@0o0O0o0O0o
说实话,这些注释我实际上没看,我看到是 java 代码,今天早上想起来,为了方便用了 C 的代码。不过,这些注释对我也没有什么意义,其他部分我已经搞定了,就是 SBox 的使用,我甚至不完整地测试了,应该可以生成逆向的 SBox 。问题就是卡在 Cycle 方法这里,也就是你猜测的 AES 的地方。但我确定不是,因为我怀疑过这个使用了某个成熟的算法的相关逻辑,所以把 AES 、DES 等 SBox 相关的逻辑都过了一遍,没有对上的。
回到问题,就是其他 SBox 的流程至少我能看懂,也不算太复杂,但这个一个字节转四个字节,四个字节做异或的我没看懂原理,找个明白的人。
billlee   
这个结构和 mix columns 看起来挺像的?
hcocoa   
@MozzieW #4 查表的时候把 1 个字节变成 4 个字节,然后 4 个“1 字节扩展出来的 4 字节”异或。也就是原来 4 字节,出来还是 4 字节,信息量没有丢失,当然可以还原回去。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部