本文主要讲述一下一个非常有趣(其实是折磨)的算法课设题目,在开始正题之前我必须吐槽一下这个课设(属实是给我整不会了)。这个课设折磨在哪呢?主要有一点:不停地加条件。我们整个小学期(3周),我所在的小组第一周的前三天,就写完了所有方法,然后已经实现了一大半的程序,然后突然,可爱的算法课题组的命题老师们经过研讨,添加了限制,我们的方案全部报废。这种过程持续了大概三四次,这又有谁顶得住的(更何况我们组一开始就已经按照严格的要求卷起来了,我们已经考虑了监听,截获各种各样的情况,依旧没有防住这些突如其来的折磨人的限制)。

吐槽到这,结束,接下来说说其他所有对于课设有用的tip。一个就是多交流,多合作,虽然大环境你很难弄到别人的方案,但是你可以去想办法交流/交换,再不济找愿意给你的hxd也不是不行啊喂!总而言之就是要多多交流好叭,你拿自己的一个方法换到了七八个方法,那能叫亏吗?再其次如果你有资源的话找找你之前的老师同学,甚至家长都可以啊,我在人大的hxd,帮我想出来了一个方案,还帮我问到了一些密码学相关的东西(比如零知识认证),这些都是很有用的东西,是吧!哎,这就叫做合理利用资源,有的时候合作真的能帮你解决N多问题(在此尤其感谢我的hxd:WSY大佬,和WZH大佬,多的不说力)。本文会更新教学视频(在bilibili),文章看的不是很懂的话可以移步去看视频!求关注!三连!B站ID:DemonTracer(不知道ID以后会不会变哦,视频请以下链接为准,失效了可以csdn私信叫我一下):

(目前还没录制!录完了就替换这个!)

接下来咱们来看看这个奇妙的题目:

Alice和Bob刚刚得知了一门考试的成绩,他们都想知道两个人成绩是否相同。但是,谁也不愿意暴露自己的成绩。假设成绩采用优、良、中、差四个等级。设计一种安全的游戏方案,使得Alice和Bob在游戏中执行响应的算法,在不暴露自己成绩的前提下判定二人成绩是否相同。

为了得到正确的判定结果,假设Alice和Bob不会篡改自己的成绩(但是可以篡改任何与自身成绩无关的信息),为了保证游戏的公平性,应保证Alice和Bob均能验证结果的正确性。

游戏场景分为以下三种:

1.除Alice和Bob之外,存在第三方且知道二人的成绩,假设第三方可信且不会泄露与成绩相关的任何信息。

2.除Alice和Bob之外,存在第三方只知道一个人的成绩(假设为Alice),假设第三方可信且不会泄露与成绩相关的任何信息。

3.除Alice和Bob之外,存在第三方但不知道任何人的成绩,假设第三方可信且不会泄露与成绩相关的任何信息。

在游戏过程中需要考虑以下因素:

性质1:假设Alice和Bob不会篡改⾃⼰的成绩,那么他 们在游戏中⼀定能够得到正确的判定结果,并且⽆法 确定对⽅的成绩。(必备项)

性质2:在场景1中,除了Alice和Bob之外,存在⼀个第 三⽅且知道⼆⼈的成绩。那么,在满⾜性质1的同时, 除了Alice、Bob和这个第三⽅之外的其他⼈不会在游 戏中得到与成绩相关的任何信息。

性质3:在场景2中,除了Alice和Bob之外,存在⼀个第 三⽅但只知道其中⼀个⼈的成绩。那么,在满⾜性质1 的同时,这个第三⽅不会在游戏中得到任何额外的信 息,并且除了Alice、Bob和这个第三⽅之外的其他⼈ 不会在游戏中得到与成绩相关的任何信息。

性质4:在场景3中,不存在任何知道Alice或Bob成绩的 第三⽅。那么,在满⾜性质1的同时,除了Alice和Bob 之外的其他⼈不会在游戏中确定任意⼀个⼈的成绩。

好,以上就是标准题目,那么在标准题目之后,我们亲爱的课题组又加了主要的以下限制:

双方在篡改与自己成绩无关的数据时,保证双方都得不到结果/双方都能得到结果。双方在使用随机数的时候需要能够识别并终止游戏或使得双方均无法得到正确结果。

这时候就需要我来解释一下这些是什么意思了。有一部分思路(比如某百万富翁思路),他们的交互流程是这样的:Alice产生一个数据,不妨称其为M,随后Alice将M发送给Bob。随后,Bob需要对M进行加工后,发送给Alice。此时,限制的作用想必各位已经明白了:M与Bob的成绩无关,因此,Bob可以选择任意值进行处理,而这并不会违反规则,从而导致整体程序出现逻辑问题。(任意值即为使用随机数)。

其他的细枝末节的限制如第三方不能比较(第一问),第三方不能直接返回成绩信息(包括密文),等等诸如此类的奇奇怪怪的东西。

在了解了基本的限制之后,我们就可以开始我们的愉快解题过程了。那么首先,我们对各种题目进行一下分析(先声明一下,难度系数:第三问 < 第一问 < 第二问)。

第一问:不分析,因为可爱的课题组在最后一周直接公开了第一题的答案,这谁顶得住哇,等会直接给你们看答案就行了。

第二问:第二问非常有意思,为什么这么说呢,因为第三方恰好知道一个人的成绩。而这也恰是我们的切入点,因为第三方恰好知道一个人的成绩,那么如果让第三方比较,就会有一个比较明显的问题:如果Alice和Bob成绩相等,那么第三方就会知道另外一个人的成绩,而这,也代表你整个系统出现的问题。那么解决方案是什么呢?有两种解决方案:第一,让第三方判断,但是不让他知道自己在判断什么。第二,不让第三方判断,让Alice和Bob相互交互,但是在这期间保障信息不会泄露。

第三问:hmm很简单的一问,因为这一问可以判断,而且第三方判断了之后知道是否相等并不视为知道和成绩有关的信息,所以这一问直接就是有手就行了。

那么接下来讲述具体的实现。而在讲述具体的实现之前,我们需要解释一下我们使用的加密方法,也就是RSA(我们并没有选择参考资料给的加密算法,因为时间复杂度太!高!了!我们用个RSA能比所有的课题组给出的标准答案都更优,所以为啥不用RSA,给的参考资料就离谱好叭)。RSA加密流程如下:选取你要加密的信息MSG,随后用公钥加密,即可得到密文。密文用公钥对应的私钥可以解开。加密需要一次模幂,解密需要一次模幂。(RSA对相同的MSG加密密文不同,含有一些奇怪的随机因子,但是这些随机的东西可以在本题中视为初始化,课题组规定初始化的东西不算时间复杂度)。

符号以及默认说明:

接下来,第三方由Carlos指代。且下文中的CA代表认证机构,这个就是个小破玩意儿,不用管它,没有也行。。(就是相当于一个确保公私钥对应Alice,Bob和Carlos的一个机构而已,自己清楚就行)。在第二问中,默认Carlos知道的是Alice的成绩。

第一问:

算法流程如下:

标准答案如是说:首先由Carlos生成四套公私钥并与四种成绩一一对应。随后,Carlos挑选Alice成绩对应的一套公私钥,将私钥发送给Alice。同理,对Bob执行相同操作。此时,Alice和Bob手中各自掌握着自己成绩所对应的私钥。随后,Carlos公开四把公钥以及其对应的成绩。随后Alice和Bob将字符 'X' 用自己成绩对应的公钥加密后,把密文发送给Carlos。Carlos解密验证双方均没有使用随机数,随后将密文转送(Bob的密文给Alice,Alice的密文给Bob),随后双方各自用私钥解密。解密失败(我们使用的是python的库,所以任何改动均会导致解密失败,如果是自己实现的RSA加密的话,可以判断是否为字符 'X')则说明双方成绩不等,否则双方成绩相等。

性质证明如下:

由于所有的信息均与成绩有关,所以不考虑篡改与成绩无关信息的情况。对于使用随机数的情况,有Carlos进行解密验证,可以保障在任意一方使用随机数后终止游戏。所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。由于Carlos本来就知道两人成绩,所以无需证明安全性。综上所述,第一问得证。

第二问:

我们在第二问中将介绍三种方案,其中一种是伪方案,不能保障对于使用随机数的情况能够识别。剩余两种方案对应上文中的两种思路。且其中一种方案,即Carlos不知道自己在判断什么这个思路,同样可以应用于第一问和第二问(所以这一个方案顶三个方案!)。

第一种方案(伪方案):

算法流程如下:

在本程序中,默认成绩优良中差对应0123。首先由Alice,Bob,Carlos分别生成交流用的公私钥,由CA认证后公布公钥。随后Alice,Bob协商,生成一套成绩的映射,如0123→3210,即0对应3,1对应2,2对应1,3对应0。在Alice,Bob确认映射后,Carlos生成四套公私钥,公布四套公钥。这里我们假设Carlos知道Alice的成绩,Carlos将Alice成绩对应的私钥传送给Alice。随后,Bob依据映射,将自己成绩映射后传递给Carlos,Carlos将Bob传送给自己的成绩所对应的私钥传送给Bob,此时,初始化完成。Bob拥有自身成绩映射后的成绩所对应的秘钥,Alice拥有自身成绩所对应的秘钥。接下来,Bob使用自身成绩所对应的公钥加密字符‘X’发送给Alice。Alice使用自身成绩映射后的成绩所对应的公钥加密后发送给Bob。Alice和Bob用自己的私钥解密,即可得到结果。

举例说明如下:

不妨设映射为0123→3210,Alice成绩为0,Bob成绩为1。那么Bob成绩映射后为2,则Bob向Carlos索要成绩2对应的私钥。剩下的均为正常流程。

性质证明如下:

由于所有的信息均与成绩有关,所以不考虑篡改成绩的情况。对于使用随机数的情况,由于过程中无法进行验证,所以不能保证对应的公平性。所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。且由于Carlos获得的是加密后的成绩,因此无法知晓Bob的成绩。同时,Alice和Bob由于只拥有各自成绩所对应的秘钥,所以无法推测出不等情况下对方的成绩,因此安全性得证。

第二种方案(通用方案):

算法流程如下:

在本程序中,默认成绩优良中差对应0123。首先由Alice,Bob,Carlos分别生成交流用的公私钥,由CA认证后公布公钥。随后Alice,Bob协商,生成四个1~512的不重复的随机数。Alice,Bob,Carlos规定互联网中结果文件的文件名。随后Alice,Bob协商,生成一套成绩的映射,如0123→3210,即0对应3,1对应2,2对应1,3对应0。此时,初始化完成。

在Alice和Bob互相确认随机数后,在对应位置填写自己的真实成绩映射后的成绩,剩余位数上随机填写0~3的数字(可直接生成一个508位的随机数,每一位都模4,将结果填入即可,因此只视为使用了一次随机数)。将结果处理完毕后,使用Carlos交流用的公钥加密,随后发送给Carlos。

Carlos收到信息后,使用私钥解密,随后将每一位的比较结果均按顺序填入规定文件,结束。

Alice和Bob比对成绩对应四位是否都为相同/都为不同,随后即可得到结论。

性质证明如下:

由于所有的信息均与成绩有关,所以不考虑篡改成绩的情况。对于使用随机数的情况,由于使用随机数并不能帮助Alice或Bob知道对应位数的信息(不拥有Carlos的私钥),这会使得双方均无法得到正确结果,因此公平性得证。所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。且对于Carlos,其解出来的信息由于均为映射后的信息,Carlos在不知道映射和填入位置的情况下,无法进行逆推,因此安全性得证。

第三种方案:

算法流程如下:

在本程序中,默认成绩优良中差对应0123。首先进行初始化:首先由Alice,Bob,Carlos分别生成交流用的公私钥,由CA认证后公布公钥。随后Carlos产生四套对应的公私钥(同方案一),并将Alice成绩对应的私钥和公钥发送给Alice,随后将公钥以随机顺序公布。随后执行如下操作:Bob产生四个随机数并排序为0号,1号,2号,3号。随后Bob产生随机数K,将K使用Carlos交流用的公钥加密后,替换自己成绩对应的数字,如自身成绩为2,则替换2号数字。将四个数字依次发送给Carlos。Carlos用自身交流用解密后会得到四个数字,Carlos将私钥和公钥分别放入这四个数字命名的文件中。由于Bob仅知道随机数K,其他数字解密需要Carlos的私钥,所以Bob只能访问该随机数K命名的文件,随后得到自己成绩对应的私钥。此时,初始化完毕,Alice和Bob拥有自身成绩对应的私钥。

接下来,Bob使用自身成绩所对应的公钥对字符‘X’进行签名发送给Alice。Alice首先依次用四把公钥对签名进行验证,若没有验证成功则说明Bob使用了随机数,若是自己成绩对应的公钥解密成功,则说明相等,否则不等。

Alice验证完毕后,Carlos使用Alice成绩对应的公钥对字符‘X’进行加密,此时Bob用自己的私钥解开,若能解开则说明相等,否则不等。

举例说明如下:

不妨设Bob成绩为2,则Bob将第三个数字(因为2是第三个,成绩是0123)替换为自己生成的随机数(如23333)加密后的密文EncryptMSG,剩下三个都是随机的信息。那么Bob只能访问23333号文件。(注:这里需要使用手动实现的RSA,python库不可直接调用)剩下的均为正常流程。

性质证明如下:

由于所有的信息均与成绩有关,所以不考虑篡改成绩的情况。对于使用随机数的情况,对于Bob使用随机数时,其信息的签名无法和任何一把公钥对应,因此必定不符合要求,可以被Alice发现,从而实现游戏的终止。所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。对于Alice,其虽然能够确定签名是否合法,但是由于Carlos公布的公钥是乱序,其无法确定不等情况下Bob的成绩。Bob的安全性证明同方案一,因此安全性得证。

第三问:

第一种方案:

算法流程如下:

在本程序中,默认成绩优良中差对应0123。首先由Alice,Bob,Carlos分别生成交流用的公私钥,由CA认证后公布公钥。随后Alice,Bob协商,生成一套成绩的映射。Carlos通知Alice和Bob结果文件的名称。此时,初始化完成。

接下来,Alice和Bob使用Carlos交流用公钥对自身映射后成绩加密发送给Carlos。Carlos解密后比较,并将结果填入对应文件即可。

性质证明如下:

由于所有的信息均与成绩有关,所以不考虑篡改成绩的情况。对于使用随机数的情况,由于是Carlos比较并公布结果,Alice和Bob不诚实会导致无法得到结果,因此公平性得证。所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。且由于Carlos获得的是加密后的成绩,因此无法知晓Alice和Bob的成绩,因此安全性得证。

第二种方案:

算法流程如下:

在本程序中,默认成绩优良中差对应0123。首先由Alice,Bob,Carlos分别生成交流用的公私钥,由CA认证后公布公钥。随后Alice生成一个随机数K。此时,初始化完成。

Alice将3减去自己成绩再加一再加上随机数K得到结果M,将M加密后发送给Carlos。将随机数K加密后发送给Bob。

Bob在收到Alice消息后,解密得到K,将自己的成绩减去K后模4得到结果ScoreB发送给Carlos。

Carlos收到信息后,使用私钥解密,得到M和ScoreB。若4减去M模4等于ScoreB,则说明两人成绩相同,否则不同。

性质证明如下:

不妨设Alice的成绩为X,Bob的成绩为Y,随机数为T。

ScoreB = (Y – T) % 4

ScoreA = (4 – (3 – X) – T - 1) % 4 = (X - T) % 4

所以可以得到正确结果。

由于所有的信息均与成绩有关,所以不考虑篡改成绩的情况。对于使用随机数的情况,由于使用随机数会使得Carlos解密结果出现问题,这会使得双方均无法得到正确结果,因此公平性得证。

所有信息在传输过程中均为密文,且由于RSA特性,每次加密生成的密文不同,所以无法暴力破解或进行比对,因此无论如何都无法获得密文中的信息,所以隐私性得证。且对于Carlos,其解出来的信息由于均为带有随机数干扰的信息,Carlos在不知道随机数T的情况下,无法进行逆推,因此安全性得证。

以上,就是全部的方案了,如果将问题二的通用方案视为三种,则有八种方案,否则为六种(当然,其中一种是伪方案)。当然,这里的方案并不包含所有的情况,肯定还会有其他的奇思妙想,如果有的话可以在csdn私信或者bilibili私信和我交流(doge),最后附上时间复杂度分析表,本文结束,谢谢各位~

AliceBobGame-2021年东北大学算法题目详解相关推荐

  1. 推荐系统整体架构及算法流程详解

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 知识图谱在美团推荐场景中的应用实践 搜索场景下的智能实体推荐 机器学习在B站推荐系统中的应用实践 小红书推荐系统 ...

  2. 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)

    论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...

  3. 蓝桥杯历年省赛JAVA-B组真题汇总及题目详解

    蓝桥杯 历年省赛JAVA-B组真题汇总及题目详解 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限得到最后结果就行. 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功. 第八题到 ...

  4. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  5. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  6. JavaScript 面试中常见算法问题详解

    JavaScript 面试中常见算法问题详解,翻译自 https://github.com/kennymkchan/interview-questions-in-javascript.下文提到的很多问 ...

  7. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  8. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  9. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

最新文章

  1. Python3学习笔记----环境安装及文本编辑器的选择
  2. 异地多活场景下的数据同步之道 | 珍藏版
  3. Vue组件多次点击报错Avoided redundant navigation to current location: “/profile“.
  4. django与grpc融合的过程
  5. Linux学习总结(十六)系统用户及用户组管理
  6. 栈溢出笔记1.7 地址问题(2)
  7. 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
  8. manjaro设置字体_Manjaro安装配置美化字体模糊发虚解决记录
  9. 【神兵利器】介绍一款支持屏幕录制、滚动截图、高清长图、图片编辑、图片转PDF格式、屏幕取色的截图软件:FastStone Capture
  10. The Active Side of Stereopsis: Fixation Strategy and Adaptation to Natural Environments
  11. 云音乐vue开发日记
  12. 用C语言编写一个电话簿管理系统
  13. 年化17.5%,十年8倍的“双低”转债策略:从零实现量化回测系统之三
  14. 数据结构考试的一些选择题
  15. LED电源按驱动方式分类,有这两种
  16. 这家创业公司,为什么会在云栖大会上被反复提及?
  17. Istio 解决的问题及注入
  18. 机器学习实战 基于_[编程]-机器学习实战-概览
  19. 盲人张海伦是怎样成为美国防部的程序猿
  20. 二、物流系统|2.2物流系统的构成、评价

热门文章

  1. 人体姿态2019(八)Distribution-Aware Coordinate Representation for Human Pose Estimation
  2. 离线安装pytorch、opencv以及各种镜像安装库
  3. vba中dir用法_VBA编程知识点(10)——Dir函数
  4. SDWebImage的坑,无网络时加载图片失败,有网络后依然无法加载显示的问题
  5. centos7 桌面程序自动启动
  6. 1262:【例9.6】挖地雷
  7. 【FZU】Problem 2217 Taxi 【暴力状压dp】
  8. ACM--A - Telephone Number
  9. 施努卡:机器视觉光源选择方法(机器视觉光源哪里有)
  10. MM32F3277 I2C 访问 LPS22HH 气压传感器