当前位置: 首页 > 科技观察

混淆程序:加密代码的最安全方法

时间:2023-03-20 16:02:33 科技观察

几十年来,计算机科学家一直在寻求验证是否存在一种绝对安全的方法来加密计算机程序,以便人们在使用它们时无法破解它们。2020年底,几位学者设法找到了一种加密方法,使计算机用户无法通过获取代码来破解程序。加密程序代码必须首先被混淆。Indistinguishabilityobfuscation(IO)是一种强大的加密算法,它不仅可以隐藏数据集,还可以隐藏程序本身,从而实现几乎所有的加密协议。要想知道什么是难分难解的迷惑,我们不妨看看什么是迷惑。对于程序员来说,最宝贵的就是代码。一旦获得源代码,基本上就意味着程序员编写代码所花费的心血付之东流,同时还会涉及知识产权纠纷。为了保护代码,一些程序员会在导出程序之前采取一些措施来混淆程序。有两种方法可以混淆当前程序。第一种是全文替换关键字,将整个代码中的所有“名称”替换为数字(例如将ui_controller替换为a0123456);二是直接输出编译后的代码,把人能看懂的源代码转换成计算机能看懂的机器码,这样别人就不能直接打开这个文件看到原代码了。这两种方法的目的是去除程序导出时的标记符号。从而达到不暴露源码信息的效果。但是这两种方式其实并没有混淆,因为虽然人类很难理解这一串代码是干什么的,但是如果把这样的代码放到编译器中,让编译器去分析整个编程语言的语法结构,如果总结一下每行指令需要做什么,那么很容易看出一些端倪。真正的混淆叫做VirtualBlackBoxObfuscation(VBB),相当于在一个黑盒子里嵌入了一个程序C。我们可以在黑盒的一端输入x,在另一端输出C(x)。.因为整个程序隐藏在一个黑盒子里,我们根本无从得知任何C语言的构造信息,也无法将输入与输出进行反推。如果实现了一个虚拟的黑盒,用户可以使用程序但无法理解程序本身,那么开发出来的程序就永远无法被破解,而且对程序进行加密的过程也会非常高效。但虚拟黑匣子的概念提出没多久,就被迅速泼了一盆冷水。2001年,七位研究人员共同提出了一个专门构造的程序,证明了一般的VBB混淆是绝对不可能的。然而,在这七位研究者的成果中,提出了一种新的混淆定义——如果一对程序A和B具有相同的功能,难道第三方无法通过新的混淆算法来区分两者吗?程序呢?对于这样的混淆,我们称之为IO。它的使用原理是:如果在程序A和B中输入相同的值,计算出O(A)=P和O(B)=P,在无法进入程序A或B的情况下,计算可以区分P来自A或B是不可行的。借助强大的无区别混淆,我们可以完美地加密现有程序,使其永远无法被破解。IO的存在已经得到证实,但量子计算依然难以抗拒2013年,美国加州大学洛杉矶分校AmitShahai教授等五位学者提出了IO协议,将一个程序拆分成若干块,比如一个益智游戏,单个的棋子可能看起来毫无意义,但如果使用多线性配对方法将棋子正确地组合在一起,程序就可以运行。多重线性配对本质上是一种使用多项式的计算方法,多项式是由不同的变量和数字组成的数学表达式,例如3xy+2yz2。为了保证其安全性,整个过程中用户无法知道任何参数。在多元线性配对法中,有一个重要的概念叫做“层数”,可以理解为计算公式中变量的阶数,比如3xy+2yz2就是一个二阶多项式,即层数层数为2;3xy+2yz4是4次多项式,层数为4。层数越多,多重线性配对的安全性越低。2016年,美国华盛顿大学副教授林慧佳开始探索是否可以通过减少多线性配对的层数来实现IO。最初,她弄清楚了如何使用30层多线性对构建IO。接下来,她和其他研究人员逐渐实现了仅用3层多线性对构建IO。从表面上看,这是一个巨大的进步。但是有一个问题——从安全的角度来看,3层多线对与任何其他3层以上多线对一样不安全。以前,研究人员只知道2级及以下的线性配对是绝对安全的。林慧佳与AmitShahai合作,试图弄清楚如何使用2层线性配对来构建IO,但研究了很长时间都没有突破。最终,他们想出了一个折衷方案:既然实现IO需要3层线性对,但为了安全需要减到2层,那中间有没有2.5层呢?研究人员设想了一个系统,可以让用户看到部分变量的值,这使得整个机制不需要加密太多变量。但是,多项式的隐变量不得超过二阶。比如3x2y+2yz4的公式中,z的值是可以被用户看到的,变量x和y的顺序是隐藏的,因为不超过二阶。因此,研究人员在保证线性配对安全的前提下,成功实现了IO。虽然几位科学家联手证明了IO的存在,但量子计算机超强的计算能力会让目前的大部分加密算法都无法抗拒,这意味着所有加密信息都会暴露在量子计算机面前。现在研究人员正在尝试开发一种新的IO潜在途径,希望能够抵御量子攻击。