98

上周,我不得不为作业创建一个小 GUI。我的同学都没有这样做。他们从我们必须上传它的地方偷了我的一个,然后他们又把它上传成了他们的。当我告诉我的老师这是我所有的工作时,他不相信我。

所以我想在里面放一个无用的方法或其他东西,并附上我编码的证明。我想到了加密。到目前为止我最好的主意:

String key = ("ZGV2ZWxvcGVkIGJ5IFdhckdvZE5U"); //My proof in base64

你能想到其他更好的方法吗?

4

11 回答 11

105

很久以前我和你有同样的问题。我们有 Windows 2000 机器并将文件上传到每个人都可以看到的 Novel 网络文件夹。我使用了几个技巧来击败最好的小偷:空白水印;元数据水印;不寻常的字符;可信时间戳;作案手法。这是他们的顺序。

空白水印:

这是我对水印的最初贡献。我需要一个在文本文件中工作的隐形水印。我想出的技巧是在编程语句(或段落)之间放入特定的空白模式。该文件在他们看来是一样的:一些编程语句和换行符。仔细选择文本会显示空白。每个空行将包含一定数量的空格,这些空格显然不是随机的或偶然的。(例如17)实际上,这种方法对我有用,因为他们无法弄清楚我在文档中嵌入了什么。

元数据水印

您可以在此处更改文件的元数据以包含信息。您可以将您的姓名、哈希值等嵌入文件的不可见部分,尤其是 EXE 文件。在 NT 时代,备用数据流很流行。

不寻常的字符

我会把这个扔进去只是为了好玩。一个古老的 IRC 模仿技巧是用与另一个人的名字相似的字母来命名。您可以在水印中使用它。Windows 中的字符映射将为您提供许多不寻常的字符,这些字符看起来类似于但不是您可能在源代码中使用的字母或数字。这些出现在别人作品中的特定位置不可能是偶然的。

可信时间戳

简而言之,您将文件(或其哈希)发送给第三方,然后第三方为其附加时间戳并使用私钥对其进行签名。任何想要证明您何时创建文档的人都可以访问受信任的第三方(通常是网站)来验证您的创建时间证明。这些已被用于知识产权纠纷的法庭案件中,因此它们是一种非常有力的证据形式。它们是完成您正在寻找的证明的标准方法。(我先把其他的 b/c 包括在内,它们很简单,它们更有趣,并且可能会起作用。)

这篇 Wikipedia 文章可能会帮助您的教师了解您的证据,并且外部链接部分有许多提供者,包括免费提供者。在将它们用于重要的事情之前,我会通过免费的测试文件运行几天。

作案手法

所以,你做了什么,你现在有证据对吗?不,学生们仍然可以说你偷了他们的想法或其他一些废话。我对此的解决方法是私下与我的导师建立我的一种或多种方法。我告诉教练寻找空白,寻找某些符号等,但永远不要告诉其他人水印是什么。如果讲师同意对您的简单技术保密,他们可能会继续正常工作。如果没有,总是有可信的时间戳。;)

于 2013-04-17T17:34:20.200 回答
63

如果你的同学从上传网站窃取了你的代码,我会加密你的作业并将密钥通过电子邮件发送给老师。如果您想复杂一点,您可以使用 PGP 来执行此操作,或者像带有密码的 Zip 文件这样简单的操作。

编辑:PGP 将允许您在不泄露您的密钥的情况下进行加密/签名,但您无法击败带有密码的 Zip 文件的简单性,因此只需在每个家庭作业中选择一个新密钥即可。简约之美 :)

于 2013-04-17T14:18:54.333 回答
39

如果您要向老师提供源代码,则只需将 a 添加serialVersionUID到您的课程文件中,该文件是您姓名的加密版本。你可以自己解密给老师。

这对其他人没有任何意义,只是对你而言。你可以说这是一个生成的代码,如果他们窃取它,可能根本不会费心去修改它。

如果你想以一种时尚的方式来做,你可以使用这个技巧,如果你找到产生你名字的随机种子。:) 那将是您的号码,无论它出现在哪里,都可以证明是制作了该代码。

于 2013-04-17T14:15:01.700 回答
35

这发生在我的一对学生身上,他们住在同一个公寓里。有人从办公桌抽屉里的磁盘上偷走了源代码。

小偷稍微修改了被盗的来源,使其不明显。无论如何,我注意到代码的相似之处,并在编辑器中检查了源代码。有些行的末端有多余的空格。每个学生的来源都有相同数量的额外空格。

您可以利用它对信息进行编码而不使其可见。您可以在某些行的末尾使用空格对您的姓名首字母或学生 ID 进行编码。

小偷可能会对可见代码进行外观更改,但可能会错过不可见字符。

编辑:

再想一想,您可以将空格和制表符用作摩尔斯电码的dits和dahs,并将您的名字放在多行的末尾。小偷可以删除、重新排序或重新键入某些行,而不会破坏您的身份。

编辑2:

“空白隐写术”是在空白中隐藏消息的术语。谷歌搜索它揭示了这个可以追溯到 90 年代的开源实现,使用霍夫曼编码而不是摩尔斯电码。

于 2013-04-17T14:27:50.500 回答
20

对我来说,这似乎是一个 IT 管理问题。每个学生都应该有自己的上传区域,其他学生无法访问。

老师将是更高级别的,能够访问每个学生的上传文件夹。如果这不可能,请使用@exabrial 答案,因为这是最简单的解决方案。

于 2013-04-17T18:48:35.063 回答
9

您能做的最好的事情就是使用密码压缩源代码并将密码通过电子邮件发送给老师。

问题解决了。

于 2013-04-18T00:06:30.997 回答
6

使用分布式(=独立)版本控制系统,例如git。也可能有用。

带有您的姓名和日期的版本历史可能足以令人信服。

于 2013-04-17T14:20:07.637 回答
3

什么被偷了?

  • 来源 ?您可以将随机字符串放入其中(但可以更改)。您也可以尝试添加只有您知道的特殊行为(特殊按键会更改颜色行),然后您可以问老师“其他人知道这个特殊组合吗?”。最好的方法是如果在 5 分钟的活动后存档中没有一个空的无用文件,则使程序崩溃,您的同学将懒得等待这段时间。

  • 二进制?只比较每个.class的校验和就足够了(你的同学懒得重写class文件)

于 2013-04-17T14:20:06.190 回答
3

只需在最后一分钟发布您的解决方案。这不会给任何人时间来复制它。

并向管理员发送反馈以禁止学生查看其他学生的作业。

于 2013-04-18T23:05:59.337 回答
1

如果您以带有密码加密的 .zip 文件上传文件,那么任何人都可以通过下载 .zip 文件来破解密码,如果他们是一个大作弊的小偷,他们的 cpu 就会对其运行一百万次查询。不幸的是,有些是而且很容易做到。

其他学生可以在共享服务器上查看您的源。老师真的应该给你自己的密码加密目录来上传。这可以通过添加子域轻松完成。但也许老师可能会允许您将文件上传到您自己的服务器,以便他在那里访问它们。

也可以对脚本进行模糊处理,使其具有 document.write('This page waswritten by xxxxx'),从而强制复制您作品的任何人无法删除信用,除非他们首先解密它。但真正的答案是,您的学校需要为每个学生提供自己的受密码保护的目录。

于 2013-04-19T01:57:02.747 回答
0

就我而言,我的老师们采用了更好的方法。他们提供的问题与我们的注册号有关。前任:

函数/理论的输入是我们的注册号,每个学生都不同

因此,每个学生的答案或解决方法都相对不同。这使得所有学生都必须自己做作业,或者至少知道如何通过自己的注册来破解方法[it可能比学习课程更难;)]。

Hope your lecturer will read this thread before his next tutorial :D
于 2013-04-18T03:36:20.707 回答