¿Cómo puedo ocultar mi firma en un programa? [cerrado]

31

Tenemos un curso de programación universitaria y otros estudiantes están haciendo algunas preguntas de programación en nuestro grupo de Facebook. Dudo un poco en compartir todos mis programas, especialmente si es algo bueno para una de las tareas, ya que estos son analizados por los TA y pueden notar si alguien tiene el mismo programa y comenzar a hacer preguntas sobre dónde vino desde. Aún así, a veces me gustaría compartir mi código para ayudar a otros, pero no quiero que la gente simplemente tome mi trabajo. (Aclaración: se nos permite colaborar con las tareas) Esto es, por supuesto, una línea delgada. Si bien quiero ayudar a algunas personas, me preocupa que no tengan la honestidad académica para reescribir el código por sí mismas.

La mayoría de mis compañeros estudiantes no están muy avanzados en sus habilidades, por lo que me saldría con la posibilidad de ocultar mi nombre en una cadena codificada en Base-64 diseñada en un lugar discreto. Aún así, puede ser demasiado obvio que una cadena aleatoria esté sentada.

¿Qué opciones existen para ocultar mi nombre en un programa sin que parezca sospechoso?

En CodeGolf, he visto que han hecho que el arte ascii se convierta en otras cosas cuando se evalúa. ¿Hay estrategias similares que podría utilizar? La solución ideal sería algo que se parezca a algo que se ajuste discretamente, pero en realidad tiene una función para demostrar que lo codifiqué desde el principio.

Aclaración: (Lo siento, debería haber dicho esto antes) Se nos permite colaborar, pero tenemos que explicar nuestros programas a los TA para obtener los puntos. Es solo por satisfacción esconder algunos Huevos de Pascua en el código de otros si se filtra, especialmente porque puede ser tentador intercambiar programas para verificar que las respuestas a los problemas que generan son equivalentes, etc. o para ver cómo otros resuelven el problema.

MikeFoxtrot
fuente
70
no compartir código, pero compartir ideas
trinquete monstruo de
77
Lo que había hecho hace unos años era tener una variable con un nombre específico (en mi caso: "pkmn") que usé en cada código que escribí, para cosas que no se notan (el tipo de cosas que usualmente llamas "i", " j "...). Cuando alguien robó mi código, no revisaron todo el código y dejaron la variable intacta. Esa fue mi firma.
DrakaSAN
29
¿Por qué nos preguntas? Pregúntele a su profesor o TA qué comportamiento apropiado es en su escuela .
Eric Lippert
66
Esta es una aplicación de esteganografía . Normalmente, las aplicaciones del mundo real implican ocultar mensajes en sonido, imágenes u otros formatos con pérdida, pero el caso general es aplicable aquí. La respuesta aceptada es buena, pero también recomendaría aprender sobre esteganografía.
2
¿Qué tal simplemente publicar código sutilmente roto?
Benjol

Respuestas:

44

Use su firma no en su código, sino en un registro de desarrollo de acceso público.

Publique su código en un repositorio público de Github. Incluya un Docblock con su nombre en el campo "Autor". De esta manera, hay un registro público de que usted es el autor real del programa.


Es posible que esto no califique como "oculto", pero en mi opinión, sí. Si un estudiante decide copiar su código, pensará que solo tiene que cambiar su firma por la suya. Imagine su sorpresa cuando presente evidencia pública de su fechoría. Para empeorar las cosas para ellos, es accesible en línea. ¡Incluso puede usar una herramienta en línea, como Diffchecker , para demostrar qué partes de su código fueron robadas!

EDITAR: Como se señaló en los comentarios, ¡ asegúrese de que su escuela permita compartir su trabajo de esta manera! OP indicó que su institución está de acuerdo con esto, ¡pero la suya podría no estarlo!

sbichenko
fuente
26
@exizt - Si bien esta es una buena idea después de un ambiente escolar. Tengo mis dudas de que la mayoría de las situaciones formales dentro de un entorno escolar acepten esto porque al final sigues compartiendo tu trabajo con otros estudiantes. Es mejor dejar tu trabajo en la escuela por tu cuenta (y solo el tuyo) hasta que hayas recibido una calificación.
Ramhound
44
@exizt - Los profesores están preocupados por hacer trampa. A menos que el profesor le diga que puede trabajar con otro estudiante, normalmente tienen la expectativa de que no sacarán el código de sus compañeros. Si necesita con el programa, existe la expectativa de que vaya al TA y / o al profesor, no a sus compañeros. Esa es la razón por la que le sugerí que se reservara su trabajo hasta que reciba una calificación. Si bien todo es cálido y confuso, el autor quiere ayudar a sus compañeros, no es su problema, no pueden hacer el trabajo sin ayuda. Él puede ayudar simplemente no tener evidencia de tal acción si quiere sentarse allí y explicar algo
Ramhound
44
¿Cómo resolvería esto al autor original? La persona que roba su código podría simplemente afirmar que lo escribió antes de su registro de github, y que se lo robó. No veo que esto aborde el problema en la pregunta.
Adam Davis
77
Habiendo TAed en mi universidad, sé con certeza (y al ver que suceda) que seguir esta respuesta lo hará citar por mala conducta académica. No conozco ninguna política universitaria en mi país (Australia) que distinga entre el copiador y el copiee con respecto al plagio, y dudo que sea sustancialmente diferente en cualquier otro lugar. ¡Es mucho más seguro guardar tu código para ti!
sapi
2
Git permite que commit confirme las marcas de tiempo que desee. Así que dudo que pueda confiar en un repositorio git para cualquier tipo de evidencia.
Zan Lynx
14

"dado que estos son analizados por los AT y pueden notar si alguien tiene el mismo programa"

Espero que sí, es parte de su trabajo detectar y castigar el engaño, el plagio y otros fraudes.
Y duplicar el trabajo de otros y pasarlo como tuyo es eso, engaño y plagio.

Muy simple: no des tu trabajo a otros. Ayúdelos a escribir los suyos si lo desea dándoles ideas sobre cómo resolver problemas, luego permítales hacer su propia codificación.

jwenting
fuente
Bingo. La primera regla de la tutoría es que debe ayudar a las personas a encontrar soluciones por su cuenta. Si no desea que las personas roben su código, no les dé el código. Si desea ayudarlos, publique sugerencias, listas de algoritmos útiles y estructuras de datos o descripciones de alto nivel de la solución.
Sean McSomething
2
Hay mucho que ganar de la colaboración a nivel de código. 1) Practique explicar el código a otros 2) Construya relaciones de trabajo 3) Aprenda los talentos de los compañeros de clase 4) Aprenda de los compañeros de clase cuando no tenga la mejor solución. Los grupos que agrupan el esfuerzo superarán a las estrellas en las islas. Los compañeros de estudios siempre serán amigos; OP está tratando de aprovechar al máximo el lado amigo mientras mitiga contra el lado enemigo ocasional.
duozmo
@duozmo no tiene nada de malo trabajar juntos (SI la tarea lo permite, por supuesto), siempre y cuando no termines haciendo el trabajo de otra persona por ellos. Y no, mis compañeros nunca fueron enemigos cuando estaba en la universidad. En el peor de los casos, eran competidores para las mejores tareas.
Jwenting
7

Al igual que la respuesta anterior, animo a usar algo como Github para registrar su desarrollo del código, hay otros métodos que podría usar para cubrir su espalda, como enviarse la fuente por correo electrónico antes de compartirlo, aunque un repositorio visible públicamente es Lo que sugeriría encarecidamente.

Eso es, por supuesto, si compartir código es muy necesario. ¿Qué pasa con el pseudocódigo? o como dijo "monstruo de trinquete", comparte la idea, no la implementación. (esto tiene más sentido para un código más complejo)

CraigChilds94
fuente
7

También podría usar uno de los trucos más antiguos para ocultar mensajes. Haga que la primera letra de cada variable oculte un mensaje. Por ejemplo,

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

// Do some work here?
Francisco Presencia
fuente
66
No dependería de algo como esto: si están usando su código, cambiar alrededor de los nombres de las variables y el orden sería un paso obvio para evitar ser atrapado copiando.
thegrinner
6

Creo que GitHub o una solución similar está bien, PERO hay dos cosas a considerar:

  • Esto todavía está dando tu trabajo a otros que se supone que deben hacerlo por sí mismos, por lo que podría ser punible sin importar si ocultas algún tipo de huevo de Pascua en él o no.
  • La política de la escuela en realidad podría ser bastante restrictiva para tales cosas. En Alemania, por ejemplo, hay varias universidades, que incluso hacen que sus estudiantes firmen una especie de "contrato", que establece que todo lo que desarrollan como parte de una tarea dada en este y aquel curso es propiedad de la universidad. y no se puede distribuir de ninguna forma sin el permiso explícito de la institución. Entonces, antes de publicar material escolar en Internet, le recomiendo que pregunte (por lo general, hay personas que trabajan en estas cosas en todas y cada una de las instituciones educativas y científicas), porque en realidad podría tener problemas y con eso no me refiero solo a obteniendo una F, pero mucho peor. Si realmente quieres ayudar a tus compañeros,
rbaleksandar
fuente
¡Todos estos son muy buenos puntos! No los he considerado en absoluto en mi respuesta.
sbichenko
gracias por la preocupación, buenos puntos :) se nos permite colaborar con otros en las tareas, pero no quiero que las personas copien mi código para su asignación si comparto algo de eso.
MikeFoxtrot 05 de
4

Los cartógrafos tienen el mismo problema . Un par de técnicas:

  1. Introduzca una desviación improbable del estilo tradicional de su idioma, por ejemplo, siempre tenga espacios desequilibrados alrededor de los operadores

    if (lefthand== righthand)

  2. Distribuya las no-operaciones en su código, si son parte del lenguaje que está utilizando.

    lefthand = righthand;;

duozmo
fuente
(1) se desmoronaría si los estudiantes están usando algo como el formateador automático de Eclipse. (2) con los NOP es agradable.
Richard Le Mesurier
¿Cómo probarías que la gente te ha estado copiando y no al revés?
Pierre Arlaud
2
@ArlaudPierre como una persona dijo anteriormente que el truco es usar algo como esto para todos los programas desde el comienzo del año, para que pueda probar que lo hizo intencionalmente y la otra persona no.
MikeFoxtrot
El primero es blech y, como se señaló, es fácilmente derrotado por un formateador; el segundo dará advertencias en cualquier buen IDE.
David Conrad
3

Prevenir el plagio en NO su trabajo como estudiante, eso es puramente en manos de un instructor / TA.

En términos generales, tratar a la escuela como si fuera un negocio de código cerrado. Sus compañeros estudiantes son colegas de otros empleadores. No puede compartir código más allá de líneas simples y cosas así, y NUNCA comparte clases o proyectos completos.

Ocultar los "Huevos de Pascua" en el código generalmente se considera poco profesional. (Las opiniones pueden variar aquí)

No hagas del código maloliente tu firma

Su "firma" o cómo diferencia su código de los demás debe ser de buen gusto y no obstaculizar su "olor" de código de ninguna manera. Es por eso que desaconsejo fuertemente lo siguiente:

  • Errores ortográficos intencionales (variables, nombres de métodos)
  • Agregar intencionalmente "rarezas" de código como no-ops para marcar el código como suyo.
  • Uso de estructura de código no estándar o inusual (espacio en blanco, saltos de línea, etc.)
  • Uso de patrones de codificación no estándar o inusuales (lógica de código real)
  • Ofuscación innecesaria de código (métodos de enterrado con métodos sin razón)
  • Cualquier otro tipo de truco de código o hechicería para tratar de distinguirlo de una manera inusual.

Entonces, ¿cómo protejo mi código?

En términos generales, restringir la disponibilidad es su mejor manera de proteger su código. Si no lo hace público y nadie piratea su computadora, su código generalmente es seguro. Claro que podría descompilarse, realizar ingeniería inversa, etc. En ese momento, no es como si coincidiera con el código que lo generó de todos modos.

Quiero hacerlo público, pero evitar que sea plagiado

Simplemente no ... Por supuesto, la magia desordenada en su código podría hacer que un plagio se destaque suponiendo que también hagan que su código esté disponible ... y no lo harán .

También te hará ver terrible cuando otros revisen tu código y se vayan. "¿Qué demonios pasa con todos los errores tipográficos y no operacionales?"

Pero quiero una firma de código, algo que pueda mirar el código y decir que hice esto, fui yo, esto es mío

Honestamente, si codifica bien, generalmente no debe distinguirse de ningún otro código en los proyectos en los que trabaja. Seguro que pueden ser matices que le permiten saber en qué trabajó en comparación con lo que hizo Bob, pero estos deberían ser bastante leves.

El único código de tiempo que se destaca en gran medida entre los pares es si algo es nuevo y nunca se ha hecho antes dentro de su círculo, o si huele de una manera única en su círculo.

RualStorge
fuente
Quieres "versus", no "versos". A menos que usted y Bob estén escribiendo poesía. ;)
David Conrad
@DavidConrad Gracias, el código es poesía después de todo;) corregido en consecuencia.
RualStorge
1

Dado que el problema es ocultar una firma en el código fuente donde

  • no será inmediatamente obvio
  • no se puede quitar de forma casual o accidental
  • puede recuperarse encontrado cuando sea necesario, hasta un nivel de certeza que constituiría una prueba.

Una variación interesante en esteganografía .

No puede utilizar el formato o el espacio en blanco, ya que cualquier IDE competente puede eliminarlo trivialmente.

Eso realmente deja solo el nombramiento de variables y funciones. No puede usar una subcadena distintiva común, porque se elimina con demasiada facilidad mediante una búsqueda y reemplazo. Eso deja el uso de nombres de variables distintivos y originales que tendrían que eliminarse individualmente. Los errores de ortografía y las palabras en idiomas extranjeros son buenos 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'?

¡Las oportunidades para la creatividad son ilimitadas!

Luego, un simple procesamiento de texto para extraer y comparar tokens descubrirá rápidamente a los plagiarios.

david.pfx
fuente
2
De hecho, voy a desalentar esto. Si bien A elogia la forma creativa de abordar este problema, estos pueden conducir a hábitos que ningún profesional quiere tratar. Enmendar una carta, etc., no es malo, pero la falta de ortografía intencional es un hábito terrible cuando trabajas en equipo. "Oh, oye, está en la carpeta 'común'", "No encuentro ninguna carpeta llamada 'común'", "Oh, mierda, quiero decir 'commom'", "... es que 'com_mom', 'comm_mom', ' commmom 'o' commom '... "
RualStorge
Obviamente no ha trabajado con ciertos proveedores externos para quienes el inglés no es el primer idioma. Conté 11 deletreos diferentes de la palabra 'anuncio' (al menos eso creo).
david.pfx
Tengo, "Commom" llegó a ser exactamente de esa manera. Ha sido algo con lo que hemos vivido hasta que molesta a alguien lo suficiente como para arreglar cualquier palabra ofensiva del día. Agregar a este problema con el propósito de destacarse como "su firma" es digno de pena
RualStorge
@RualStorge: Ah. ¿Una respuesta ingeniosa, pero tal vez no una para trotar en una entrevista?
david.pfx
1
No, pero hay muchas cosas que uno no dice en un proceso de entrevista. Como ingresar a una empresa con una gestión de proyectos deficiente ... Uno no dice que planean usar activamente subterfugios sutiles e insubordinación límite para mejorar la práctica y las políticas de la compañía, pero aquí estamos;)
RualStorge
1

La sugerencia de duozmo de noops posiblemente generará malas marcas por descuido, pero eso podría ser algo bueno para incluir en el código de ejemplo que no se supone que se use literalmente.

Eso me inspiró a pensar en un patrón de alternancia de pestañas y espacios en los espacios en blanco iniciales y finales.

Andy Dent
fuente
44
Ya hay un lenguaje para ello: en.wikipedia.org/wiki/Whitespace_(programming_language)
Ondrej Svejdar
0

Algo similar que he usado antes es crear variables con el mismo nombre que otras variables importantes pero dejar sus nombres en función del editor de texto para que el cambio no sea fácilmente obvio, o usar letras con acentos. Llame a varias funciones, a las que envía muchas de las variables importantes del programa desde una instrucción if, utilizando sus variables, que nunca serán verdaderas, por ejemplo, if (1eft == wrōng) Establezca alguna variable importante en una función inútil para su firma ofuscada.

Debería poder encontrar varios tutoriales sobre 'Cómo escribir código que no se pueda mantener' que podrían ayudar.

sanepete
fuente
Sin embargo, esto se debe bajar de marcas como los programas no son tan buenas como deberían ser y también las AT no podrán leerlos
user151019
Su calificación será penalizada por esto típicamente si se nota. A nadie le gusta cuando vas a buscar "logRepository" solo para encontrar que en realidad es "1ogRepository", simplemente te hace quedar mal.
RualStorge
Eso me ha dicho. Traeré mi abrigo.
sanepete