CPS-2加密算法取得极大进展,攻克在即!
今年圣诞节前后的模拟界似乎额外冷清,平静的表面下却暗流汹涌。近来,Nicola与Andy两人对CPS-2加密算法展开了持续的攻坚战(见多识广的模拟技术专家+密码分析专业人士,一看就有戏),经过两人的讨论,目前已基本明确了CPS-2采用的是一种类似DES的4-Pass Feistel Network,懂密码学的朋友肯定很熟悉:)从密码分析的角度来看,似乎加密强度还不及DES(可能是考虑到了rom加解密的实现代价,DES是16-pass的);至昨天为止,Nicola已经给出了求解其中关键的替代/选择函数(S盒子)的具体方法,甚至连CPS2-Shock的Raz都以专门更新的方式来欢呼这一胜利,看来真的离成功不远了。不过,目前他们的分析工作还没有真正完成,尽管算法已经清楚了,但密钥分析方面的工作才刚开始,所以仍需耐心等待。以下是相关算法研究进展的持续跟踪:
1/8/2006
Nicola终于将地址和密钥关系大致搞清楚了,他推测整个的算法流程为: 16位地址和96位密钥经过第一个Feistel网络得到16位子密钥;然后这16位子密钥、16位密文和另一个96位密钥再经过第二个Feistel网络最终得到明文。Nicola已对第一个FN进行了确认——也是一个4-Pass FN,并断定如果能将第一个FN中的S盒成功确定下来的话(迟早的事),那么他便能不依赖于任何已知的表(从Charles Macdonald处得到的,但获得的方法未知,Raz给出的XoR表也许也是重要的参照信息之一)、从无到有地将rom进行完整解密了!不过目前他所使用的两个96位密钥还是来自已知的表,也就是说,根据目前的知识,对于那些已知部分表格的游戏,用真正的解密方式解出来不是件难事,但对那些没有任何已知表格的游戏,两个96位密钥还不知道该怎么去找,他也许正在思考着如何利用差分密码分析来进一步地研究这一问题...继续学习.
1/10/2006
Nicola已将目前所得到的算法源码提交给了MAMEDEV。FN1中的S盒据说仍不太精确,但已经getting work了。稍微看了一下代码,里面的dd非常有趣,比方说CPS-2使用了硬件watchdog,加/解密是针对opcode而不是针对data的,同时还必须结合opcode当前的指令地址来考虑等等;其opcode解密的大致流程为:首先根据opcode address和key1经FN1解出seed,然后再将seed扩展至sub-key,然后再用sub-key与key2进行xor,最后根据其结果和opcode经FN2解出opcode的明文... 颇周折,但还算清楚。Nicola猜想key1/key2也许能够通过硬件watchdog调用指令中的opcode导出来,不过他暂时还没有给出很明确的方法。有空再仔细看看,顺便把FN的知识捡回来...
1/13/2006
Nicola给出了暴力破解key1/key2的方法,坏消息是这种获得密钥的方式只能针对已知XoR表(即已知明文)的游戏;好消息是通过暴力破解获取多个密钥对,Nicola发现key1/key2之间存在着很强的相关性,它们也许均只是某一相同密钥的置换而已,Nicola期望通过这种相关性来找到进一步修正FN1中S盒的有效途径。现在的问题是,对于那些没有获得XoR表的游戏,我们该到哪里去找这两个密钥?也许key1/key2的关系能够从中透漏点线索;也许这根本不是个问题,因为CPS-2游戏已被XoR方式Crack得没剩下几个了。
1/15/2006
Nicola发现96位的key1可以通过一个64位的密钥master_key导出来,他对解密流程进行了修改,其过程大致为:已知master_key(64),将其扩展至key1(96);通过FN1(key1,opcode address)算出一个seed(16);然后将seed(16)扩展至subkey(64),再将subkey(64)扩展成key2(96);最后通过FN2(key2,opcode ciphertext)得明文。可以看出对于每一个不同的opcode 地址而言,key2是不一样的.... 这是CPS-2加密算法中最令人感到棘手的一个性质,但master_key和key1却是始终固定的。Nicola进一步修正了FN1中的S盒;他同时还指出,watchdog调用指令中的opcode与master_key没有关系,他猜想CPS-2中以自杀电池维护的加密设备RAM中共有128位数据,其中的48位为watchdog调用指令,16位为加密的地址范围,而剩下的64位则为游戏的master_key。至今为止,Nicola已经通过暴力尝试的方式获得了大部分游戏的master_key,但是仍有一部分游戏因为sample(即密文、明文对)不够多而无法得到其master_key,Nicola目前还没有想到什么好办法来克服这一困难。老实说,我对Andy是怎样判断出FN的方法更感兴趣,可是....他为什么要用西班牙文来写他的blog呢?.....又被郁闷到了。
1/17/2006
Nicola以暴力破解的方式获得了大多数具有XoR文件的CPS-2游戏的master_key,他指出,要有效地破解一个游戏,对于同一地址A而言,必须拥有至少7个(E,D,A)三元组,其中E为操作数密文,D为操作数XoR处理之后的明文。仍然还存在着一部分游戏无法获得master_key,原因在于它们只拥有少数几个(<7)相同地址的三元组,Nicola猜想也许可以通过“互补”性质来获得更多的三元组,不过这有可能导致“误报”,即破解出来的结果并不是真正的master_key,这需要一点运气和耐心。目前,对于那些并不具备XoR文件的游戏,还不存在有效获取master_key的方法。
1/22/2006
实验证明将“互补”性质用于蛮力破解是有效的,Nicola借助这一方式再次成功地获得了若干个master_key,但是即便如此,仍然存在着不少游戏根本没有办法以暴力方式破解,因为可以利用的同址三元组实在太少了。目前进展十分有限,Nicola尝试着比较了一下属于同一游戏的多个语言版本的master_key,并试图观察出它们彼此之间所可能存在的某种联系,不过这种方式看起来似乎需要点想象力,还有难得的运气。
2/18/2006
Nicola以表驱动方式对暴力破解的程序进行了改良,使速度获得了极大提高。他指出,每多获得一个(E,D)组合,便能将FN2的96位密钥空间缩小2^16倍,因此对于FN2的96位密钥,仅需96/16=6个(E,D)即可破解,其前提是,这些(E,D)对所对应的opcode address(即A)必须是相互兼容的,即,它们的地址A的低17位必须是相同的。而问题是,并不是所有的游戏都能找到足够数量的符合条件的(E,D,A)对,在这一关键问题上,Nicola的进展非常有限,Andy在此期间也尝试了一种新方法,但也失败了。目前,经Nicola改良之后的暴力破解程序的效率得到了较大的提高,破解已知8个(E,D,A)对的rom仅需15秒,而破解已知3个(E,D)对的游戏则需要将近1天的时间。在经历并克服了许多磨难之后,Nicola和Andy两位也明显有些疲惫了,是该好好休息了。