客户端到底能不能防破解? 想必大部分 v 友都会摇头 say no 。
最近偶然发现,「密码学」竟然可以做到让客户端无法破解!!而且是密码学意义上的无法破解!跟 RSA 同样性质的无法破解。what??!!
这次还是通过这位博主的博文: http://blog.higashi.tech/2020/11/10/io_01.html 。上次看过他介绍「全同态加密」的文章。感谢🙏他的无私分享。
怎样做到客户端无法破解呢?说一下我的一知半解:
先给出「不可区分混淆」的概念: 给定被混淆的 2 个程序 C1,C2 ,而 C1,C2 拥有同样的功能。假如能构造一种混淆算法,使得第三方无法区分这两个电路的混淆结果 iO(C1)和 iO(C2),那么称为这种算法为不可区分混淆。 「 iO 」是 Indistinguishability Obfuscation 的缩写
比如 C++源码,以及源码编译后得到的二进制码,可以看作拥有同样的功能。
javascript 经过各种混淆的前后,也可以看作拥有同样的功能。
是不是发现「不可区分混淆」这个概念有点绕,什么叫作不可区分呢?说实话我也不懂。 不过不要急,这里有一个非常「诡异」的论证(原始论文中的例子),来说明「不可区分混淆」的神奇所在!
在我们进行软件开发的时候,有一件非常头疼的事情,那就是软件试用版的开发。假如我们在写一个游戏,我们已经把整个游戏写好了,但是想开放一部分的游戏免费给玩家试用,这个时候我们面临两种选择:
- 第一种方案,就是我们把整个游戏复制一份,然后把收费版的功能和逻辑全部都一一删除掉,最后就留下免费试用的部分并且发布出去。这种方案虽然是最好的,但是整个过程会花费大量的精力,最后生成的“阉割”版本的游戏甚至可能还会有未知的 bug 需要我们来修补。
- 第二种方案则非常简单,我们直接在软件内部设置一组 feature flags (功能开关),可以选择性的打开或者关闭一部分的功能。我们可以在试用版的软件中把收费的功能对应的 flag 都关闭,这样整个程序就不会运行任何付费的功能了。这种方案相对来说比较常见,但是问题在于,一旦黑客破解了我们的程序,然后把收费功能打开的话,那么这些功能就一览无余了。
这个时候,就轮到「不可区分混淆」登场了。参照图中所示,我们同时对第一种方案中的试用版程序与第二种方案中的限制版程序进行「不可区分混淆」处理。我们观察发现,因为左右两边的程序在功能性上是完全相同的,所以我们无法分清看到的混淆输出到底是来自第一种方案还是第二种方案。
这样一来,我们就可以基于第二种方案的限制版程序,施加一层「不可区分混淆」,得到的结果与混淆删减版的是不可取分的,代码都删减了还怎么破解呢?
基于「多线性配对」的「不可区分混淆」算法,已经构造出来了。而这个算法的安全性,依赖于 4 个密码学假设,其中有 1 个稍弱。意思是只要这 4 个假设成立,那么不可区分混淆就是密码学意义上安全的。白话就是:客户端就可以防破解,密码学意义上的防破解。
但构造方法有了,不意味着现实中也可以有效实现:目前这个构造方法,哪怕在实验室里的运用也远不如「全同态加密」:代码膨胀、运算效率问题都非常非常非常严重。
题外话:「不可区分混淆」用于防破解仅仅是牛刀小试————据说它甚至可以看作是密码学领域的「原力」哦。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.