如何在程序中隐藏我的签名?[关闭]


31

我们有一所大学的编程课程,并且同学们正在我们的Facebook组中提出一些编程问题。我有些犹豫,不愿分享我的所有程序,尤其是对于其中一项任务来说很酷的时候,因为这些内容是由技术顾问查看的,他们可能会注意到有人是否拥有相同的程序,并开始询问程序的来源从。不过,有时候我还是想分享自己的代码来帮助他人,但是我不希望人们只是抓住我的工作。(澄清:我们被允许与任务协作)这当然是一条很短的路线。虽然我想帮助一些人,但我担心他们可能没有学术上的诚实来自行编写代码。

我的大多数同学在技能上都不是很熟练,所以我想说的是,将我的名字隐藏在精心制作成离散位置的Base-64编码字符串中。尽管如此,对于随机的字符串来说还是坐着太明显了。

有哪些选项可以隐藏我的名字而不使其看起来可疑?

我在CodeGolf上看到,他们在评估时将ascii艺术转化为其他东西。我可以利用类似的策略吗?理想的解决方案是看起来很适合的东西,但实际上具有证明我从一开始就对其进行编码的功能。

澄清:(对不起,应该早点说)我们可以合作,但必须向TA解释我们的计划以获取积分。如果某些复活节彩蛋泄漏出去,这是很令人满意的,特别是因为它可能很想交换程序来检查它们产生的问题的答案是否相等,或者看看其他人如何解决该问题。


70
不共享代码但共享想法
棘手怪胎

7
几年前,我做了一个带有特定名称的变量(在我的情况下为:“ pkmn”),该变量在我编写的每个代码中都使用,用于不明显的事情(通常称为“ i”,“ j“ ...)。当有人偷走了我的代码时,他们并没有遍历所有代码,并保持变量不变。那是我的签名。
2014年

29
你为什么要问我们 询问您的教授或助教,您学校的适当行为是什么
埃里克·利珀特

6
这是隐写术的一种应用。通常,现实世界中的应用程序涉及以声音,图像或其他有损格式隐藏消息,但是一般情况适用于此。公认的答案是一个很好的答案,但我建议您也学习隐写术。

2
只发布巧妙地破坏代码怎么样?
Benjol 2014年

Answers:


44

不在代码中使用签名,而在可公开访问的开发日志中使用签名。

在公开的Github存储库中发布您的代码。在“作者”(Author)字段中包含您的名字的Docblock。这样,您就可以公开记录该程序的实际作者。


这可能不算是“隐藏”,但我认为确实如此。如果学生决定复制您的代码,他们会认为他们只需要交换您的签名即可。当您向公众展示他们的不法行为时,请想象一下他们的惊讶。更糟糕的是,他们可以在线访问。您甚至可以使用Diffchecker之类的在线工具来演示代码的哪些部分被盗!

编辑:正如评论中指出的那样,请确保您的学校允许以这种方式分享您的作品!OP表示他们的机构可以这样做,但您的机构可能不满意!


26
@exizt-虽然这是一个放学后的好主意。我怀疑学校环境中的大多数正式情况会接受这种做法,因为最终您仍然与其他学生分享您的作品。 最好让您自己的学校作业(和您自己的作业),直到获得相应的成绩为止。
拉姆猎犬,2014年

4
@exizt-教授担心作弊。除非教授说您可以与另一位学生一起工作,否则他们通常会期望您不会向同行学习代码。如果您需要该程序,则期望您去助教和/或教授而不是同行。这就是为什么我建议自己坚持自己的工作直到获得成绩的原因。尽管这一切都是温暖和模糊的,但作者希望帮助同龄人,这不是他的问题,他们没有帮助就无法开展工作。如果他想坐在那里解释一下,他就可以帮忙,没有证据表明这样做
Ramhound 2014年

4
这将如何解决原始作者?窃取您代码的人可以简单地声称他们是在github签入之前编写的,并且您从他们那里偷了它。我看不到这解决了问题中的问题。
亚当·戴维斯

7
在我的大学接受TA培训后,我知道一个事实(并且从观察到的事实中得知),遵循此答案将使您因学术不端行为而被人引用。我不知道我的国家(澳大利亚)有任何大学政策会在抄袭和抄袭之间区别窃,我怀疑在其他地方是否会有实质性的不同。将代码保存在自己手中更安全!
sapi 2014年

2
Git允许提交设置所需的任何时间戳。因此,我怀疑您是否可以依靠git repo获得任何证据。
Zan Lynx 2014年

14

“由于TA会仔细检查这些内容,并且他们可能会注意到某人是否具有相同的程序”,

我希望如此,这是检测和惩罚作弊,窃和其他欺诈行为的一部分。
复制他人的作品并将其作为自己的作品传播是欺骗和that窃。

非常简单:不要把工作交给别人。帮助他们编写自己的解决方案,方法是为他们提供解决问题的想法,然后让他们自己编写代码。


答对了。补习的第一条原则是,您应该帮助人们自己找到解决方案。如果您不希望别人窃取您的代码,请不要给他们提供代码。如果要帮助他们,请发布提示,有用的算法和数据结构列表或解决方案的高级描述。
肖恩·麦克索明

2
代码级协作可以带来很多好处。1)练习向他人解释代码2)建立工作关系3)学习同学的才华4)在没有最佳解决方案的情况下向同学学习。全力以赴的团队将胜过岛屿上的明星。同胞们永远是朋友。OP试图从朋友方面获得最大收益,同时缓解偶尔出现的敌人方面。
duozmo 2014年

@duozmo在一起工作没有任何问题(如果分配允许的话),只要您不为别人做别人的工作即可。不,我上大学时,我的同学从来都不是敌人。最糟糕的是,他们是最佳任务的竞争对手。
jwenting 2014年

7

像上面的答案一样,我鼓励使用类似Github的代码来记录您的代码开发,您还可以使用其他方法来掩护自己,例如在共享源之前先将源发送给自己,我强烈建议。

如果非常需要共享代码,那当然是必要的。伪代码呢?或像“棘轮怪胎”所述,分享想法而不是执行。(这对于更复杂的代码更有意义)


7

您还可以使用最古老的技巧之一隐藏消息。使每个变量的第一个字母隐藏一条消息。例如,

$Image = "test";
$a = "/test/img.jpg";
$message = "This is img.jpg";
$Full = 435674;
$rate = 3;
$ascii = "---....!--";
$number = 2040;
$k = 5;

// Do some work here?

6
我不会依赖这样的东西-如果他们使用他的代码,更改变量名和顺序将是避免被复制的明显步骤。
grinner 2014年

6

我认为GitHub或类似的解决方案可以,但是要考虑两点:

  • 这仍然将您的工作交给应该自己做的其他人,因此无论您是否在其中隐藏某种复活节彩蛋,这都可能会受到惩罚。
  • 学校的政策实际上可能对这类事情有严格的限制。例如,在德国,有很多大学,甚至使他们的学生签署某种“合同”,其中指出,他们作为本次作业的一部分而开发的一切,这是大学的财产未经机构的明确许可,不得以任何形式分发。因此,在将学校内容发布到Internet上之前,我强烈建议您问(通常在每个教育和科研机构中都有从事这些工作的人),因为您实际上可能会遇到麻烦,而这并不意味着得到一个F,但更糟。如果您真的想帮助您的伴侣,

这些都是非常好的观点!我的回答根本没有考虑它们。
sbichenko 2014年

感谢您的关心,好点子:)我们被允许在任务上与他人合作,但是我不希望人们分享我的代码来分配他们的任务。
MikeFoxtrot

4

制图师也有同样的问题。几种技术:

  1. 引入与您的语言传统风格不太可能的偏差,例如,操作员周围始终有不平衡的空间

    if (lefthand== righthand)

  2. 如果无操作是您使用的语言的一部分,则将它们分散在整个代码中。

    lefthand = righthand;;


如果学生使用的是Eclipse的自动格式化程序,则(1)会崩溃。(2)使用NOP是一个不错的选择。
理查德·勒·马修里尔

您如何证明人们一直在模仿您,而不是反过来?
皮埃尔·阿洛德

2
@ArlaudPierre曾经说过,这个技巧从年初开始就在所有程序中都使用了类似的方法,这样您就可以证明您是故意这样做的,而另一个人则没有。
MikeFoxtrot 2014年

如前所述,第一个是污点,很容易被格式化程序打败。第二个将在任何良好的IDE中发出警告。
戴维·康拉德

3

防止抄袭不是您作为学生时的工作,这完全由教师/助教负责。

一般来说,像对待学校一样是封闭源代码业务。您的同学是其他雇主的同事。除了简单的代码,您不能共享代码,也永远不能共享整个类或项目。

在代码中隐藏“复活节彩蛋”通常被认为是不专业的。(意见可能会有所不同)

不要让臭代码成为您的签名

您的“签名”或如何将您的代码与其他代码区分开来,应该很有品味,而不以任何方式阻碍您的代码“气味”。这就是为什么我强烈不鼓励以下情况的原因:

  • 故意拼错的东西(变量,方法名称)
  • 故意添加诸如“无操作”之类的代码“奇数”,以将代码标记为您的代码。
  • 使用非标准或异常的代码结构(空格,换行符等)
  • 使用非标准或异常编码模式(实际编码逻辑)
  • 不必要的代码混淆(使用in方法无理由地掩埋方法)
  • 任何其他种类的代码诡计或巫术,试图以一种不寻常的方式来区分它。

那我该如何保护我的代码?

一般来说,限制可用性是保护代码的最佳方法。如果您不公开公开代码,而且没有人入侵您的计算机,那么您的代码通常是安全的。当然,可以将其反编译,反向工程等。那时,它并不匹配生成它的代码。

我想公开它,但要防止它被窃

只是不行……前提是您的代码中凌乱的巫术可以使a窃者脱颖而出,前提是他们也可以使用自己的代码...而他们不会

当其他人查看您的代码并继续执行时,这也会使您看起来很糟糕。“所有错别字和无操作到底是怎么回事?”

但是我想要一个代码签名,我可以看一下代码并说做到了,这是我,这是我的

老实说,如果您编写的代码正确,通常应该与您所从事的项目中的任何其他代码没有区别。当然,他们的细微差别可能会让您知道您所做的工作与鲍勃所做的事情,但是这些应该相当温和。

唯一一次在同行中脱颖而出的代码是,如果有新事物出现并且从未在您的圈子中完成过,或者它以您圈子中唯一的方式闻到。


您要的是“对抗”,而不是“经文”。除非你和鲍勃在写诗。;)
David Conrad

@DavidConrad谢谢,代码毕竟是诗歌;)相应地进行了更正。
RualStorge 2014年

1

鉴于问题在于在源代码中隐藏签名,

  • 这不会立即变得明显
  • 不能随意或不小心将其卸下
  • 可以在需要时将其恢复到一定程度的确定性,以构成证明。

隐写术的一个有趣的变化。

您不能使用格式或空格,因为任何合格的IDE都可以将其删除。

确实只剩下变量和函数的命名。您不能使用公共的独特子字符串,因为它很容易被搜索和替换删除。这就留下了必须单独删除的独特和原始变量名的使用。拼写错误和外语单词是不错的选择。

if (a== x) {}   // disappears on reformatting
int gghhjj_i;   // easily removed by search and replace, if all the same
int couunt = 0;  //spelling
int nummer = 0; // german
float doppel = 0.0; // german
string spago = "xx"; // italian
boolean manana = true; // spanish
struct perzon;  // excess use of z's.
class employeej; // what if every variable contained a 'j'?

创新的机会是无限的!

然后,一些用于提取和比较标记的简单文本处理将迅速发现窃者。


2
我实际上会阻止这种情况。尽管A赞扬解决这个问题的创新方法,但这些方法可能会导致没有专业人士想要处理的习惯。修改字母等还不​​错,但是在团队合作中,故意拼错是一个可怕的习惯。“哦,嘿,它在'common'文件夹中“,”我没有找到任何名为'common'的文件夹“,”哦,废话,我的意思是'commom'“,” ...就是'com_mom','comm_mom',' commmom'或'commom'...”
RualStorge

您显然没有与某些英语不是第一语言的外包商合作。我数了11个“公告”一词的不同拼写(至少我认为是这样)。
david.pfx 2014年

我已经说过,“ Commom”就是这样。这是我们一直生活的事情,直到它惹恼某个人,足以解决一天中最令人讨厌的单词。为了突出“您的签名”的目的而增加这个问题是值得的
RualStorge 2014年

@RualStorge:啊。一个巧妙的答案,但是也许没有人在面试中能回答?
david.pfx 2014年

1
不,但是话又说回来,有很多很多事情在采访过程中没有说过。例如进入一家项目管理不佳的公司...没有人说他们计划积极利用微妙的欺骗手段和边界不服从来改善公司的做法和政策,但是我们来了;)
RualStorge 2014年


0

我以前使用过的类似方法是创建与其他重要变量相同的变量,但要根据文本编辑器来命名它们的名称,这样更改就不容易显而易见,或者使用带重音的字母。调用几个函数,利用您的变量从if语句向程序发送许多重要变量,这些变量将永远不会为真,例如if(1eft ==wrōng)在无用函数中为混淆后的签名设置一些重要变量。

您应该能够找到一些有关“如何编写无法维护的代码”的教程,这可能会有所帮助。


但是,这会丢失您的标记,因为程序不如应有的好,并且TA也将无法读取它们
user151019 2014年

如果注意到,您的成绩通常会为此受到惩罚。没有人喜欢在搜索“ logRepository”时发现它实际上是“ 1ogRepository”,这只会使您看起来很糟糕。
RualStorge 2014年

告诉我了。我去买外套。
sanepete 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.