Como ocultar minha assinatura em um programa? [fechadas]


31

Temos um curso de programação universitária e colegas estão fazendo algumas perguntas de programação em nosso grupo no Facebook. Estou um pouco hesitante em compartilhar todos os meus programas, especialmente se for algo interessante para uma das tarefas, uma vez que estes são examinados pelos ATs e eles podem perceber se alguém tiver o mesmo programa e começar a fazer perguntas sobre onde ele veio. a partir de. Ainda assim, às vezes eu gostaria de compartilhar meu código para ajudar outras pessoas, mas não quero que as pessoas simplesmente agarrem meu trabalho. (Esclarecimento: Temos permissão para colaborar com as tarefas) É claro que é uma linha fina. Embora eu queira ajudar algumas pessoas, estou preocupado que elas não tenham a honestidade acadêmica de reescrever o código por conta própria.

A maioria dos meus colegas não é muito avançada em suas habilidades, então eu diria que, escondendo meu nome na string codificada na Base 64, trabalhada em um local discreto. Ainda assim, pode ser óbvio demais para uma string aleatória estar sentada.

Que opções existem para ocultar meu nome em um programa sem parecer suspeito?

Eu vi no CodeGolf que eles fizeram arte ASCII se transformar em outras coisas quando avaliados. Existem estratégias semelhantes que eu poderia utilizar? A solução ideal seria algo que se encaixa discretamente, mas na realidade tem a função de provar que eu o codifiquei desde o início.

Esclarecimento: (Desculpe, deveria ter dito isso antes) Podemos colaborar, mas precisamos explicar nossos programas aos ATs para obter os pontos. É apenas para satisfação ocultar alguns Ovos de Páscoa no código de outros, se vazar, especialmente porque pode ser tentador trocar programas para verificar se as respostas para os problemas que eles geram são equivalentes etc. ou para ver como os outros resolvem o problema.


70
não compartilhar o código, mas compartilhar idéias
catraca aberração

7
O que eu fiz alguns anos atrás foi ter uma variável com um nome específico (no meu caso: "pkmn") que usei em todos os códigos que escrevi, para coisas que não são perceptíveis (o tipo de coisa que você costuma chamar de "i", " j "...). Quando alguém roubou meu código, ele não passou por todo o código e deixou a variável intocada. Essa foi a minha assinatura.
DrakaSAN

29
Por que você está nos perguntando? Pergunte ao seu professor ou AT qual é o comportamento apropriado em sua escola .
Eric Lippert 5/05

6
Esta é uma aplicação de esteganografia . Normalmente, os aplicativos do mundo real envolvem ocultar mensagens em sons, imagens ou outros formatos com perdas, mas o caso geral é aplicável aqui. A resposta aceita é boa, mas eu recomendaria aprender sobre esteganografia também.

2
Que tal publicar um código sutilmente quebrado?
Benjol

Respostas:


44

Use sua assinatura não no seu código, mas em um log de desenvolvimento acessível ao público.

Publique seu código em um repositório público do Github. Inclua um Docblock com seu nome no campo "Autor". Dessa forma, há um registro público de você ser o autor real do programa.


Isso pode não se qualificar como "oculto", mas, na minha opinião, sim. Se um aluno decidir copiar seu código, ele achará que precisará trocar apenas a assinatura pela sua. Imagine a surpresa deles quando apresentar evidências públicas de seus erros. Para piorar a situação, é acessível online. Você pode até usar uma ferramenta on-line, como o Diffchecker , para demonstrar quais partes do seu código foram roubadas!

EDIT: Como indicado nos comentários, verifique se sua escola permite compartilhar seu trabalho dessa maneira! O OP indicou que a instituição deles está bem com isso, mas a sua pode não estar!


26
@exizt - Embora seja uma boa ideia depois de um ambiente escolar. Tenho minhas dúvidas de que a maioria das situações formais em um ambiente escolar aceitaria isso porque, no final, você ainda compartilha seu trabalho com outros alunos. É melhor deixar a escola trabalhar por conta própria (e só a sua) até depois de receber uma nota.
Ramhound 5/05

4
@exizt - Os professores estão preocupados com a trapaça. A menos que o professor diga que você pode trabalhar com outro aluno, ele normalmente tem uma expectativa de que você não oculte o código de seus colegas. Se você precisar do programa, há uma expectativa de que você vá ao AT e / ou ao professor, e não aos seus colegas. Essa foi a razão pela qual sugeri que você mantivesse seu trabalho sozinho até receber uma nota. Embora seja quente e confuso, o autor quer ajudar seus colegas, não é problema dele que eles não possam fazer o trabalho sem ajuda. Ele pode ajudar simplesmente não têm evidência de tal ato Se ele quer sentar lá e explicar alguma coisa
Ramhound

4
Como isso resolveria o autor original? A pessoa que está roubando seu código pode simplesmente alegar que o escreveu antes do check-in do github e que você o roubou. Não vejo isso abordando o problema na questão.
Adam Davis

7
Tendo estudado na minha universidade, sei de fato (e de ver isso acontecer) que, após esta resposta, você será citado por má conduta acadêmica. Não conheço nenhuma política universitária no meu país (Austrália) que faça distinção entre copiador e copiado em relação ao plágio, e duvido que seja substancialmente diferente em qualquer outro lugar. É muito mais seguro manter seu código para você!
sapi 5/05

2
O Git permite que o commit defina os carimbos de data e hora que desejar. Portanto, duvido que você possa confiar em um repositório git para qualquer tipo de evidência.
Zan Lynx

14

"Uma vez que estes são analisados ​​pelos ATs e eles podem perceber se alguém tiver o mesmo programa"

, espero que sim, é parte do trabalho deles detectar e punir trapaceiros, plágios e outras fraudes.
E duplicar o trabalho de outras pessoas e distribuí-lo como seu é isso, trapaça e plágio.

Tão simples: não entregue seu trabalho a outras pessoas. Ajude-os a escrever seus próprios, se quiser, dando-lhes idéias sobre como resolver problemas e, em seguida, deixe-os fazer sua própria codificação.


Bingo. A primeira regra do ensino é que você deve ajudar as pessoas a encontrar soluções por conta própria. Se você não quer que as pessoas roubem seu código, não dê a elas o código. Se você quiser ajudá-los, publique dicas, listas de algoritmos e estruturas de dados úteis ou descrições de alto nível da solução.
Sean McSomething

2
Há muito a ganhar com a colaboração em nível de código. 1) Pratique explicar o código para outras pessoas 2) Construir relações de trabalho 3) Aprender o talento dos colegas 4) Aprender com os colegas quando você não tiver a melhor solução. Grupos que se esforçam para superar as estrelas nas ilhas. Os colegas sempre serão frenemies; O OP está tentando tirar o máximo proveito do lado do amigo enquanto atenua o lado inimigo ocasional.
Duozmo

@duozmo nada de errado em trabalhar juntos (SE a tarefa permitir, é claro), desde que você não acabe fazendo o trabalho de outra pessoa por eles. E não, meus colegas nunca foram inimigos quando eu estava na universidade. Na pior das hipóteses, eles eram concorrentes das melhores tarefas.
jwenting

7

Como a resposta acima, incentivo o uso de algo como o Github para registrar seu desenvolvimento do código, existem outros métodos que você pode usar para proteger suas costas, como enviar um email para a fonte antes de compartilhá-la, embora um repositório visível ao público seja o que eu sugiro fortemente.

Isso é claro se o compartilhamento de código for altamente necessário. E o pseudo-código? ou como "catraca anormal" afirmou, compartilhe a ideia e não a implementação. (isso faz mais sentido para código mais complexo)


7

Você também pode usar um dos truques mais antigos para ocultar mensagens. Faça a primeira letra de cada variável ocultar uma mensagem. Por exemplo,

$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
Eu não dependeria de algo assim - se eles estiverem usando o código dele, mudar nomes e ordem das variáveis ​​seria um passo óbvio para evitar ser pego copiando.
thegrinner

6

Eu acho que o GitHub ou uma solução semelhante está bem, mas há duas coisas a considerar:

  • Isso ainda está dando o seu trabalho a outras pessoas que deveriam fazê-lo sozinhas; portanto, pode ser punível, independentemente de você esconder ou não algum tipo de ovo de Páscoa.
  • A política da escola pode ser bastante restritiva a essas coisas. Na Alemanha, por exemplo, existem várias universidades que até fazem seus alunos assinarem uma espécie de "contrato", que afirma que tudo o que eles desenvolvem como parte de uma tarefa dada neste e naquele curso é propriedade da universidade e não pode ser distribuído de qualquer forma sem a permissão explícita da instituição. Portanto, antes de postar material escolar na Internet, recomendo fortemente que você pergunte (geralmente existem pessoas que trabalham nessas coisas em todas as instituições educacionais e científicas), porque você pode realmente ter problemas e com isso não quero dizer apenas ficando um F, mas muito pior. Se você realmente quer ajudar seus companheiros,

Todos esses são pontos muito bons! Não os considerei na minha resposta.
Sbichenko 5/05

obrigado pela preocupação, pontos positivos :) estamos autorizados a colaborar com outras pessoas nas tarefas, mas não quero que as pessoas copiem o código do meu código para sua atribuição, se eu compartilhar parte dele.
MikeFoxtrot

4

Os cartógrafos têm o mesmo problema . Algumas técnicas:

  1. Introduzir um desvio improvável do estilo tradicional do seu idioma, por exemplo, sempre tenha espaços desequilibrados ao redor dos operadores

    if (lefthand== righthand)

  2. Espalhe no-ops em todo o seu código, se eles fizerem parte do idioma que você está usando.

    lefthand = righthand;;


(1) desmoronaria se os alunos estivessem usando algo como o auto-formatador do Eclipse. (2) com os NOPs é bom.
Richard Le Mesurier

Como você provaria que as pessoas estão copiando você e não o contrário?
Pierre Arlaud

2
@ArlaudPierre, como uma pessoa disse anteriormente, o truque é usar algo assim para todos os programas desde o início do ano, para que você possa provar que fez isso intencionalmente e a outra pessoa não.
MikeFoxtrot

O primeiro é blech e, como apontado, é facilmente derrotado por um formatador; o segundo emitirá avisos em qualquer bom IDE.
David Conrad

3

Prevenir o plágio NÃO em seu trabalho como estudante, isso é puramente nas mãos de um instrutor / AT.

De um modo geral, tratam a escola como se fosse um negócio de código fechado. Seus colegas são colegas de outros empregadores. Você não pode compartilhar código além de simples liners, e NUNCA compartilhar classes ou projetos inteiros.

Ocultar "Ovos de Páscoa" no código geralmente é visto como não profissional. (As opiniões podem variar aqui)

Não faça do código fedorento sua assinatura

Sua "assinatura" ou como você diferencia seu código dos outros deve ter bom gosto e não impedir que seu código "cheire" de forma alguma. É por isso que desencorajo fortemente o seguinte:

  • Intencionalmente com erros ortográficos (variáveis, nomes de métodos)
  • Adicionando intencionalmente "esquisitices" de código, como no-ops, para marcar o código como seu.
  • Usando estrutura de código não padrão ou incomum (espaço em branco, quebras de linha, ect)
  • Usando padrões de codificação não padronizados ou incomuns (lógica de código real)
  • Ofuscação desnecessária de código (enterrando métodos com em métodos sem motivo)
  • Qualquer outro tipo de truque ou magia de código para tentar diferenciá-lo de uma maneira incomum.

Então, como faço para proteger meu código ?!

De um modo geral, restringir a disponibilidade é a melhor maneira de proteger seu código. Se você não o tornar público e ninguém invadir seu computador, seu código geralmente é seguro. Claro que pode ser descompilado, com engenharia reversa, etc. Nesse momento, não é como se fosse o código que o gerou de qualquer maneira.

Quero torná-lo público, mas impedir que seja plagiado

Apenas não ... Por suposto, a magia bagunçada no seu código pode fazer com que um plágio se destaque assumindo que eles também disponibilizem seu código ... e eles não o farão .

Também fará com que você pareça terrível quando outras pessoas analisarem seu código e partirem. "o que diabos é com todos os erros de digitação e não-operações?"

Mas eu quero uma assinatura de código, algo que eu possa ver e dizer que fiz isso, fui eu, isso é meu

Honestamente, se você codifica bem, geralmente deve ser indistinguível de qualquer outro código nos projetos em que trabalha. Claro que podem ser nuances que permitem que você saiba no que trabalhou ou no que Bob fez, mas essas devem ser razoavelmente leves.

O único código de tempo que se destaca em grande parte entre os colegas é se algo é novo e nunca foi feito antes dentro do seu círculo, ou cheira de uma maneira única ao seu círculo.


Você quer "versus", não "versos". A menos que você e Bob estejam escrevendo poesia. ;)
David Conrad

@DavidConrad Obrigado, afinal, o código é poesia;) corrigido de acordo.
RualStorge

1

Dado que o problema é ocultar uma assinatura no código fonte onde

  • não será imediatamente óbvio
  • não pode ser removido casualmente ou acidentalmente
  • pode ser recuperado encontrado quando necessário, a um nível de certeza que constituiria prova.

Uma variação interessante sobre esteganografia .

Você não pode usar formatação ou espaço em branco, pois isso pode ser removido trivialmente por qualquer IDE competente.

Isso realmente deixa apenas nomes de variáveis ​​e funções. Você não pode usar uma substring distintiva comum, porque ela é facilmente removida por uma pesquisa e substituição. Isso deixa o uso de nomes de variáveis ​​distintos e originais que precisariam ser removidos individualmente. Erros de ortografia e palavras em línguas estrangeiras são bons candidatos.

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'?

As oportunidades para a criatividade são ilimitadas!

Então, um simples processamento de texto para extrair e comparar tokens descobrirá rapidamente os plagiadores.


2
Na verdade, eu vou desencorajar isso. Embora A elogie a maneira criativa de lidar com esse problema, eles podem levar a hábitos que nenhum profissional deseja lidar. A alteração de uma carta, etc. não é ruim, mas é intencional com erros ortográficos um péssimo hábito quando se trabalha em equipe. "Oh, ei, está na pasta 'comum'", "Não estou encontrando nenhuma pasta chamada 'comum'", "Oh, merda, quero dizer 'comum'", "... é esse 'com_mom', 'comm_mom', ' commmom ', ou' commom '... "
RualStorge

Obviamente, você não trabalhou com certos terceirizados para os quais o inglês não é o primeiro idioma. Eu contei 11 grafias diferentes da palavra 'anúncio' (pelo menos é o que eu acho que elas eram).
David.pfx

Eu tenho, "Commom" veio a ser exatamente dessa maneira. Tem sido algo com que vivemos até que irrita alguém o suficiente para consertar qualquer que seja a palavra ofensiva do dia. Somando-se a este problema com a finalidade de se destacar como "a sua assinatura" é cringe digno
RualStorge

@RualStorge: Ah. Uma resposta engenhosa, mas talvez não uma para trotar em uma entrevista?
David.pfx

1
Não, mas, novamente, há muitas coisas que não se diz em um processo de entrevista. Como entrar em uma empresa com um gerenciamento de projeto ruim ... Não se diz que eles planejam usar ativamente subterfúgios sutis e insubordinação fronteiriça para melhorar as práticas e políticas da empresa, mas aqui estamos nós;)
RualStorge


0

Algo semelhante que eu usei antes é criar variáveis ​​nomeadas da mesma forma que outras variáveis ​​importantes, mas definir os nomes deles, dependendo do editor de texto, para que a mudança não seja facilmente óbvia ou usar letras com acentos. Chame várias funções, para as quais você envia muitas das variáveis ​​importantes do programa a partir de uma instrução if, utilizando suas variáveis, o que nunca será verdadeiro, por exemplo, se (1eft == wrōng) Defina uma variável importante em uma função inútil para sua assinatura ofuscada.

Você deve encontrar vários tutoriais sobre 'Como escrever código não sustentável' que podem ajudar.


No entanto, este deve perder marcas como os programas não são tão bons como deveriam ser e também os ATs não será capaz de lê-los
user151019

Sua nota será penalizada por isso normalmente, se for notada. Ninguém gosta quando você pesquisa "logRepository" apenas para descobrir que é "1ogRepository", apenas faz você parecer mal.
RualStorge

Isso já me disse. Vou pegar meu casaco.
Sanepete
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.