Come posso nascondere la mia firma in un programma? [chiuso]


31

Abbiamo un corso di programmazione universitaria e altri studenti stanno ponendo alcune domande di programmazione nel nostro gruppo Facebook. Sono un po 'titubante nel condividere tutti i miei programmi, soprattutto se è qualcosa di interessante per uno dei compiti, dal momento che questi sono esaminati dagli agenti di amministrazione e potrebbero notare se qualcuno ha lo stesso programma e iniziare a fare domande su dove è arrivato a partire dal. Tuttavia, a volte mi piacerebbe condividere il mio codice per aiutare gli altri, ma non voglio che le persone prendano semplicemente il mio lavoro. (Chiarimento: ci è permesso collaborare con i compiti) Questa è ovviamente una linea sottile. Anche se voglio aiutare alcune persone, sono preoccupato che non abbiano l'onestà accademica di riscrivere il codice da soli.

La maggior parte dei miei compagni di studio non è molto avanzata nelle loro capacità, quindi vorrei scappare dicendo di nascondere il mio nome in una stringa codificata in Base 64 fabbricata in un posto discreto. Tuttavia, potrebbe essere troppo ovvio per una stringa casuale essere seduta in giro.

Quali opzioni esistono per nascondere il mio nome in un programma senza sembrare sospetto?

Ho visto su CodeGolf che hanno trasformato l'Ascii Art in altre cose quando valutato. Ci sono strategie simili che potrei utilizzare? La soluzione ideale sarebbe qualcosa che assomigli a qualcosa che si adatta discretamente, ma in realtà ha una funzione per dimostrare che l'ho codificato dall'inizio.

Chiarimento: (Spiacente, avrei dovuto dirlo prima) Siamo autorizzati a collaborare, ma dobbiamo spiegare i nostri programmi agli addetti ai lavori per ottenere i punti. È solo per soddisfazione nascondere alcune uova di Pasqua nel codice di altri se fuoriesce, soprattutto perché potrebbe essere allettante scambiare programmi per verificare che le risposte ai problemi che generano siano equivalenti ecc. O per vedere come gli altri risolvono il problema.


70
non condividere codice ma condividere idee
maniaco del cricchetto

7
Quello che avevo fatto qualche anno fa era avere una variabile con un nome specifico (Nel mio caso: "pkmn") che ho usato in ogni codice che ho scritto, per cose non evidenti (il tipo di cose che di solito chiami "i", " j" ...). Quando qualcuno ha rubato il mio codice, non ha passato tutto il codice e ha lasciato intatta la variabile. Questa era la mia firma.
DrakaSAN,

29
Perché ci stai chiedendo? Chiedi al tuo professore o TA quale comportamento appropriato è nella tua scuola .
Eric Lippert,

6
Questa è un'applicazione di steganografia . Normalmente le applicazioni del mondo reale implicano nascondere messaggi in suoni, immagini o altri formati con perdita, ma il caso generale è applicabile qui. La risposta accettata è buona, ma consiglierei di imparare anche sulla steganografia.

2
Che ne dici di pubblicare solo un codice sottilmente rotto?
Benjol,

Risposte:


44

Usa la tua firma non nel tuo codice, ma in un registro di sviluppo accessibile al pubblico.

Pubblica il tuo codice in un repository Github pubblico. Includi un Docblock con il tuo nome nel campo "Autore". In questo modo c'è un record pubblico di te che sei l'autore effettivo del programma.


Questo non può essere qualificato come "nascosto", ma secondo me lo fa. Se uno studente decide di copiare il tuo codice, penserà che dovrà solo scambiare la propria firma con la tua. Immagina la loro sorpresa quando presenti prove pubbliche della loro trasgressione. A peggiorare le cose per loro, è accessibile online. Puoi persino usare uno strumento online, come Diffchecker , per dimostrare quali parti del tuo codice sono state rubate!

EDIT: Come sottolineato nei commenti, assicurati che la tua scuola ti permetta di condividere il tuo lavoro in questo modo! OP ha indicato che la loro istituzione è d'accordo, ma la tua potrebbe non esserlo!


26
@exizt - Anche se questa è una buona idea dopo un ambiente scolastico. Dubito che la maggior parte delle situazioni formali all'interno di un ambiente scolastico lo accetterebbero perché alla fine continuerai a condividere il tuo lavoro con altri studenti. È meglio lasciare che la tua scuola lavori da sola (e solo tua) fino a quando non avrai ricevuto un voto.
Ramhound,

4
@exizt - I professori sono preoccupati per l'inganno. A meno che il professore non dica che puoi lavorare con un altro studente, normalmente si aspettano che non derivi il codice dai tuoi colleghi. Se hai bisogno del programma, c'è un'aspettativa che tu vada dall'AT e / o dal professore, non dai tuoi colleghi. Qual è il motivo per cui ti ho suggerito di mantenere il tuo lavoro per te fino a quando non ricevi un voto. Mentre è tutto caldo e sfocato l'autore vuole aiutare i suoi coetanei non è un suo problema, ma non possono fare il lavoro senza aiuto. Può aiutare a non avere prove di una simile azione Se vuole sedersi lì e spiegare qualcosa
Ramhound

4
Come risolverebbe l'autore originale? La persona che ruba il tuo codice potrebbe semplicemente affermare di averlo scritto prima del tuo check-in github e che tu l'hai rubato da loro. Non vedo questo affrontare il problema nella domanda.
Adam Davis,

7
Avendo frequentato l'università, so per certo (e dal vederlo accadere) che seguire questa risposta ti farà citare per cattiva condotta accademica. Non sono a conoscenza di alcuna politica universitaria nel mio paese (Australia) che distingua tra il copiatore e il copyee per quanto riguarda il plagio, e dubito che sarebbe sostanzialmente diverso da qualsiasi altra parte. È molto più sicuro mantenere il codice per te!
sapi,

2
Git consente al commit di impostare tutti i timestamp che desidera. Quindi dubito che tu possa fare affidamento su un repository git per qualsiasi tipo di prova.
Zan Lynx,

14

"dato che questi sono esaminati dagli agenti di stampa e potrebbero notare se qualcuno ha lo stesso programma"

Lo spero, fa parte del loro lavoro individuare e punire imbrogli, plagio e altre frodi.
E duplicare il lavoro degli altri e trasmetterlo come tuo è quello, barare e plagio.

Così semplice: non dare il tuo lavoro agli altri. Aiutali a scrivere i propri se vuoi dando loro idee su come risolvere i problemi, poi lascia che facciano il loro codice.


Bingo. La prima regola del tutoraggio è che dovresti aiutare le persone a trovare soluzioni per conto proprio. Se non vuoi che le persone rubino il tuo codice, non dare loro il codice. Se vuoi aiutarli, pubblica suggerimenti, elenchi di utili algoritmi e strutture dati o descrizioni di alto livello della soluzione.
Sean McSomething

2
C'è molto da guadagnare dalla collaborazione a livello di codice. 1) Esercitati a spiegare il codice agli altri 2) Costruire relazioni di lavoro 3) Imparare i talenti dei compagni di classe 4) Imparare dai compagni di classe quando non hai la soluzione migliore. I gruppi che uniscono lo sforzo supereranno le stelle sulle isole. Gli studenti compagni saranno sempre frenetici; OP sta cercando di ottenere il massimo dal lato amico mentre mitiga contro il lato nemico occasionale.
duozmo,

@duozmo non c'è niente di sbagliato nel lavorare insieme (se l'incarico lo consente ovviamente), a patto che tu non finisca per fare il lavoro di qualcun altro per loro. E no, i miei compagni non erano mai nemici quando ero all'università. Nel peggiore dei casi erano concorrenti per i compiti più belli.
jwenting

7

Come la risposta di cui sopra, incoraggio a utilizzare qualcosa come Github per registrare lo sviluppo del codice, esistono altri metodi che è possibile utilizzare per coprirsi la schiena, ad esempio inviare via e-mail la fonte prima della condivisione, sebbene un repository visualizzabile pubblicamente sia cosa suggerirei fortemente.

Questo è ovviamente se la condivisione del codice è altamente necessaria. Che dire dello pseudo-codice? o come dichiarato "maniaco del cricchetto", condividere l'idea e non l'implementazione. (questo ha più senso per un codice più complesso)


7

Puoi anche usare uno dei trucchi più vecchi per nascondere i messaggi. Rendi nascosta un messaggio alla prima lettera di ogni variabile. Per esempio,

$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
Non dipenderei da qualcosa del genere: se stanno usando il suo codice, cambiare i nomi delle variabili e l'ordine sarebbe un passo ovvio per evitare di essere sorpresi a copiare.
thegrinner

6

Penso che GitHub o una soluzione simile vadano bene, ma ci sono due cose da considerare:

  • Questo sta ancora dando il tuo lavoro agli altri che dovrebbero farlo da soli, quindi potrebbe essere punibile, indipendentemente dal fatto che ci nasconda o meno una specie di uovo di Pasqua.
  • La politica della scuola potrebbe in realtà essere piuttosto restrittiva per queste cose. In Germania, ad esempio, ci sono un certo numero di università, che fanno persino firmare ai loro studenti una sorta di "contratto", in base al quale tutto ciò che sviluppano come parte di un compito assegnato in questo e che il corso è di proprietà dell'università e non può essere distribuito in nessuna forma senza il permesso esplicito dell'istituzione. Quindi prima di pubblicare materiale scolastico su Internet ti consiglio vivamente di chiedere (di solito ci sono persone che lavorano su queste cose in ogni istituzione educativa e scientifica), perché potresti davvero metterti nei guai e con ciò non intendo solo ottenere una F, ma molto peggio. Se vuoi davvero aiutare i tuoi compagni,

Questi sono tutti punti molto buoni! Non li ho considerati affatto nella mia risposta.
sbichenko,

grazie per la preoccupazione, i punti positivi :) possiamo collaborare con gli altri alle attività, ma non voglio che le persone copino il mio codice per il loro incarico se ne condivido alcune.
MikeFoxtrot,

4

I cartografi hanno lo stesso problema . Un paio di tecniche:

  1. Introdurre una deviazione improbabile dallo stile tradizionale della tua lingua, ad esempio avere sempre spazi squilibrati intorno agli operatori

    if (lefthand== righthand)

  2. Spargi le no-op in tutto il codice, se fanno parte della lingua che stai utilizzando.

    lefthand = righthand;;


(1) andrebbe in pezzi se gli studenti usassero qualcosa come l'auto-formatter di Eclipse. (2) con i NOP è bello.
Richard Le Mesurier,

Come dimostreresti che le persone ti hanno copiato e non viceversa?
Pierre Arlaud,

2
@ArlaudPierre come in precedenza una persona ha detto che il trucco è usare qualcosa di simile per tutti i programmi dall'inizio dell'anno, in modo da poter dimostrare che l'hai fatto intenzionalmente e l'altra persona no.
MikeFoxtrot,

Il primo è blech e, come sottolineato, è facilmente sconfitto da un formattatore; il secondo fornirà avvertenze in ogni IDE valido.
David Conrad,

3

Prevenire il plagio NON nel tuo lavoro come studente, è puramente nelle mani di un istruttore / TA.

In generale, trattano la scuola come se fosse un affare a fonte chiusa. I tuoi compagni studenti sono colleghi per altri datori di lavoro. Non puoi condividere il codice al di là di una semplice linea e simili e non condividi MAI intere classi o progetti.

Nascondere "Easter Eggs" nel codice è generalmente visto come non professionale. (Le opinioni possono variare qui)

Non rendere il codice puzzolente la tua firma

La tua "firma" o il modo in cui differenzia il tuo codice dagli altri dovrebbe essere di buon gusto e non ostacolare in alcun modo il "profumo" del tuo codice. Questo è il motivo per cui scoraggio fortemente quanto segue:

  • Errori ortografici intenzionali (variabili, nomi dei metodi)
  • Aggiunta intenzionale di "stranezze" come no-op per contrassegnare il codice come tuo.
  • Utilizzo di una struttura di codice non standard o insolita (spazi bianchi, interruzioni di riga, ect)
  • Utilizzo di schemi di codifica non standard o insoliti (logica del codice reale)
  • Offuscamento inutile del codice (metodi di seppellimento con metodi in senza motivo)
  • Qualsiasi altro tipo di inganno o magia per cercare di distinguerlo in modo insolito.

Quindi come posso proteggere il mio codice ?!

In generale, limitare la disponibilità è il modo migliore per proteggere il codice. Se non lo rendi pubblico e nessuno compromette il tuo computer, il tuo codice è generalmente sicuro. Certo, potrebbe essere decompilato, retroingegnerizzato, ecc. A quel punto non è come se corrispondesse al codice che l'ha generato comunque.

Voglio renderlo pubblico, ma impedire che venga plagiato

Proprio no ... Sicuramente la disordinata magia nel tuo codice potrebbe far risaltare un plagio supponendo che rendano disponibile anche il loro codice ... e non lo faranno .

Ti farà anche sembrare terribile quando gli altri guardano il tuo codice e vanno. "che diavolo è con tutti i refusi e no-ops?"

Ma voglio una firma del codice, qualcosa che posso guardare il codice e dire che l' ho fatto, sono stato io, questo è mio

Onestamente, se si codifica bene, in genere dovrebbe essere indistinguibile da qualsiasi altro codice nei progetti su cui si lavora. Sicuramente le loro sfumature potrebbero farti sapere su cosa hai lavorato rispetto a ciò che Bob ha fatto, ma dovrebbero essere abbastanza lievi.

L'unico time code che si distingue in modo notevole tra i peer è se qualcosa è nuovo e mai fatto prima all'interno della tua cerchia, o ha un odore in un modo unico per la tua cerchia.


Vuoi "contro", non "versi". A meno che tu e Bob non stiate scrivendo poesie. ;)
David Conrad,

@DavidConrad Grazie, dopo tutto, il codice è poesia;) corretto di conseguenza.
RualStorge,

1

Dato che il problema è nascondere una firma nel codice sorgente dove

  • non sarà immediatamente ovvio
  • non può essere rimosso casualmente o accidentalmente
  • può essere recuperato trovato quando necessario, ad un livello di certezza che costituirebbe una prova.

Una variazione interessante sulla steganografia .

Non è possibile utilizzare la formattazione o gli spazi bianchi, perché possono essere banalmente rimossi da qualsiasi IDE competente.

Questo lascia davvero solo la denominazione di variabili e funzioni. Non è possibile utilizzare una sottostringa distintiva comune, perché è troppo facilmente rimossa da una ricerca e sostituzione. Ciò lascia l'uso di nomi di variabili distintivi e originali che dovrebbero essere rimossi individualmente. Gli errori di ortografia e le parole in lingua straniera sono buoni candidati.

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

Le opportunità per la creatività sono infinite!

Quindi una semplice elaborazione del testo per estrarre e confrontare i token scoprirà rapidamente i plagiaristi.


2
In realtà lo scoraggerò. Mentre A elogia il modo creativo di affrontare questo problema, questi possono portare ad abitudini che nessun professionista vuole affrontare. Modificare una lettera, ecc. Non è male, ma l'ortografia intenzionale è un'abitudine terribile da avere quando si lavora in gruppo. "Oh hey è nella cartella 'comune'", "Non trovo alcuna cartella denominata 'comune'", "Oh merda intendo 'commom'", "... è che 'com_mom', 'comm_mom', ' commmom ', o' commom '... "
RualStorge,

Ovviamente non hai lavorato con determinati outsourcing per i quali l'inglese non è la prima lingua. Ho contato 11 diversi tipi di ortografia della parola "annuncio" (almeno è quello che penso fossero).
david.pfx,

Ho, "Commom" è venuto per essere in quel modo esatto. È stato qualcosa con cui abbiamo vissuto fino a quando non ha fatto arrabbiare qualcuno abbastanza da sistemare qualunque sia la parola offensiva del giorno. L'aggiunta a questo problema allo scopo di distinguersi come "la tua firma" è degna di essere
cresciuta

@RualStorge: Ah. Una risposta ingegnosa, ma forse non una da trotterellare in un'intervista?
david.pfx,

1
No, ma di nuovo ci sono molte cose che non si possono dire in un processo di intervista. Come entrare in un'azienda con una cattiva gestione del progetto ... Non si dice che intendono utilizzare attivamente un sottile sotterfugio e insubordinazione borderline per migliorare la pratica e le politiche dell'azienda, ma eccoci qui;)
RualStorge


0

Qualcosa di simile che ho usato prima è quello di creare variabili con lo stesso nome di altre variabili importanti, ma lasciare i loro nomi a seconda dell'editor di testo in modo che il cambiamento non sia facilmente ovvio o usare lettere con accenti. Chiama diverse funzioni, a cui invii molte delle variabili importanti del programma da un'istruzione if, utilizzando le tue variabili, il che non sarà mai vero, ad esempio if (1eft == wrōng) Imposta alcune variabili importanti in una funzione inutile sulla tua firma offuscata.

Dovresti essere in grado di trovare diversi tutorial su "Come scrivere codice non mantenibile" che potrebbero essere d'aiuto.


Tuttavia, questo dovrebbe farti perdere punti poiché i programmi non sono buoni come dovrebbero e anche i TA non saranno in grado di leggerli
user151019

Il tuo voto sarà penalizzato per questo in genere se notato. A nessuno piace quando vai alla ricerca di "logRepository" solo per scoprire che in realtà è "1ogRepository" ti fa solo apparire male.
RualStorge,

Questo mi ha detto. Prendo il cappotto.
sanepete,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.