Wikiversità itwikiversity https://it.wikiversity.org/wiki/Pagina_principale MediaWiki 1.39.0-wmf.21 first-letter Media Speciale Discussione Utente Discussioni utente Wikiversità Discussioni Wikiversità File Discussioni file MediaWiki Discussioni MediaWiki Template Discussioni template Aiuto Discussioni aiuto Categoria Discussioni categoria Area Discussioni area Corso Discussioni corso Materia Discussioni materia Dipartimento Discussioni dipartimento Education Program Education Program talk TimedText TimedText talk Modulo Discussioni modulo Accessorio Discussioni accessorio Definizione accessorio Discussioni definizione accessorio Corso:Ingegneria informatica 102 1522 259473 253892 2022-07-19T13:00:20Z TheRukk 21034 Aggiunto corso al dipartimento di tecnologie dell'informazione wikitext text/x-wiki {{nota disambigua|il corso d'Informatica|[[Corso:Informatica]]}} {{Corso |7 |classe=L9 |cestor=http://www.cestor.it/atenei/l008.htm |banner=Crystal128-laptop.svg |dip=Tecnologie dell'informazione |presentazione= [[Immagine:Nuvola_apps_mycomputer.png|left]] L''''ingegneria informatica''' si occupa dell'analisi, dello sviluppo e del progetto dei sistemi per l'elaborazione dell'informazione. Un ingegnere informatico è quel professionista in grado di svolgere attività nella pianificazione, progettazione, realizzazione, gestione e esercizio di sistemi e infrastrutture per la rappresentazione, la trasmissione e l'elaborazione delle informazioni. È un esperto delle applicazioni teoriche e organizzative legate all'informatica, con conoscenza dei principali linguaggi di programmazione [[C]], [[C++]], [[Materia:Java|Java]]. Gli ingegneri, oltre allo studio teorico dell'informatica in quanto scienza, si avvalgono e contribuiscono a sviluppare la tecnologia necessaria ai fini su menzionati, coniugando solide conoscenze di base di tipo metodologico, tecnico e scientifico con specifiche competenze professionalizzanti. {{quote|Sono convinto che l'informatica abbia molto in comune con la [[Corso:Ingegneria_fisica|fisica]]. Entrambe si occupano di come funziona il mondo a un livello abbastanza fondamentale. La differenza, naturalmente, è che mentre in fisica devi capire come è fatto il mondo, in informatica sei tu a crearlo. Dentro i confini del computer, sei tu il creatore. Controlli – almeno potenzialmente – tutto ciò che vi succede. Se sei abbastanza bravo, puoi essere un dio. Su piccola scala.|[[q:Linus_Torvalds|Linus Torvalds]]}} |base=<br /> === Materie ingegneristiche di base === *[[Materia:Analisi matematica|Analisi matematica]] *[[Materia:Algebra lineare|Algebra lineare]] *[[Materia:Geometria|Geometria]] *[[Materia:Fisica generale 1|Fisica 1]] *[[Materia:Fondamenti di elettrotecnica|Elettrotecnica]] *[[Materia:Lingua inglese|Lingua inglese]] *[[Materia:Chimica|Chimica]] *[[Materia:Economia ed organizzazione aziendale|Economia ed organizzazione aziendale]] *[[Materia:Ricerca operativa|Ricerca operativa]] === Automatica, Elettronica e Telecomunicazioni === *[[Materia:Elettronica|Elettronica]] *[[Materia:Reti logiche|Reti logiche]] *[[Materia:Controlli automatici|Controlli automatici]] *[[Materia:Teoria dei segnali|Teoria dei segnali]] *[[Materia:Misure elettroniche|Misure elettroniche]] *[[Materia:Elettronica analogica|Elettronica analogica]] *[[Materia:Sensori e trasduttori|Sensori e trasduttori]] *[[Materia:Comunicazioni elettriche|Comunicazioni elettriche]] *[[Materia:Reti di telecomunicazioni|Reti di telecomunicazioni]] *[[Materia:Tecnologie per l'automazione e la robotica|Tecnologie per l'automazione e la robotica]] === Informatica === *[[Materia:Informatica Teorica|Informatica teorica]] *[[Materia:Ingegneria del software|Ingegneria del software]] ==== Programmazione ==== *[[Materia:Algoritmi_e_strutture_dati|Algoritmi e strutture dati]] *[[Materia:Fondamenti_di_programmazione_in_C|Fondamenti di programmazione in C]] *[[Materia:Laboratorio di informatica 1|Laboratorio di informatica 1]] *[[Materia:Programmazione orientata agli oggetti|Programmazione orientata agli oggetti]] *[[Materia:Basi di dati 1|Basi di dati 1]] *[[Materia:Linguaggi di programmazione web|Linguaggi e programmazione web]] ==== Architetture ==== *[[Materia:Architetture degli elaboratori|Architetture degli elaboratori]] *[[Materia:Sistemi operativi|Sistemi operativi]] |specializzazione=<br /> === Robotica e AI === *[[Materia:Intelligenza artificiale|Intelligenza artificiale]] *[[Materia:Machine learning|Machine learning]] *[[Materia:Robotica|Robotica]] === Architetture === * [[Materia:Architetture avanzate degli elaboratori|Architetture avanzate degli elaboratori]] * [[Materia:Impianti informatici|Impianti informatici]] * [[Materia:Sistemi operativi real-time|Sistemi operativi real-time]] * [[Materia:Sistemi embedded|Sistemi embedded]] === Ingegneria del software e informatica teorica === *[[Materia:Linguaggi formali e automi|Linguaggi formali e automi]] *[[Materia:Metodi di verifica e testing|Metodi di verifica e testing]] === Gestione dei dati === *[[Materia:Identificazione dei Modelli ed Analisi dei Dati|Identificazione dei Modelli ed Analisi dei Dati]] *[[Materia:Basi di dati 2|Basi di dati 2]] === Multimedialità === *[[Materia:Informatica multimediale|Informatica multimediale]] *[[Materia:Informatica grafica|Informatica grafica]] *[[Materia:Ingegneria del suono|Ingegneria del suono]] *[[Materia:Teorie e tecniche di elaborazione dell'immagine|Teorie e tecniche di elaborazione dell'immagine]] === Da altri corsi === *[[Materia:Fisica generale 2|Fisica 2]] *[[Materia:Laboratorio di fisica|Laboratorio di fisica]] *[[Materia:Compatibilità elettromagnetica|Compatibilità elettromagnetica]] *[[Materia:Propagazione e Trasmissione|Propagazione e Trasmissione]] *[[Materia:Matematica discreta|Matematica discreta]] *[[Materia:Matematica applicata|Matematica applicata]] *[[Materia:Analisi numerica|Analisi numerica]] }} [[ar:كلية علوم الكمبيوتر]] [[cs:Program: Informatika]] [[en:Portal:Computer Science]] sqqpu9yi9advzf58netz2reh9qyscfr Programmazione orientata agli oggetti 0 3200 259474 222442 2022-07-19T13:23:56Z TheRukk 21034 Uso di linguaggio più comprensibile senza conoscenze approfondite. Wikificato parzialmente. wikitext text/x-wiki {{risorsa|tipo=lezione|materia1=Programmazione orientata agli oggetti}} La '''programmazione orientata agli oggetti''' ('''OOP''', '''O'''bject '''O'''riented '''P'''rogramming) è un [[w:paradigma di programmazione|paradigma di programmazione]], che prevede di raggruppare in un'unica entità (la [[w:classe (informatica)|classe]]) sia le [[w:struttura dati|strutture dati]] che le [[w:funzione (informatica)|procedure]] (o funzioni) che operano su di esse, creando per l'appunto un "[[w:oggetto (informatica)|oggetto]]" software dotato di '''proprietà''' (dati) e '''metodi''' ([[w:funzione (informatica)|procedure]]) che operano sui dati dell'oggetto stesso. La [[w:modularizzazione|modularizzazione]] di un programma viene realizzata progettando e realizzando il codice sotto forma di classi che interagiscono tra di loro. Un programma ideale, realizzato applicando i criteri dell'OOP, sarebbe completamente costituito da oggetti software ('''istanze''' di classi) che interagiscono gli uni con gli altri. La programmazione orientata agli oggetti è particolarmente adatta a realizzare [[w:GUI|interfacce grafiche]]. ==Storia== Il concetto di '''classe''' può essere considerato l'erede del [[w:tipo di dato astratto|tipo di dato astratto]], una tendenza che si è sviluppata all'interno del paradigma della [[w:programmazione procedurale|programmazione procedurale]], tipica di linguaggi come il [[Linguaggio C|C]], secondo la quale un [[w:Modulo (programmazione)|modulo]] dovrebbe implementare un [[w:tipo di dato|tipo di dato]] definito dall'utente, con cui si possa interagire solo attraverso una [[w:interfaccia|interfaccia]] ben definita, che nasconda agli altri moduli i dettagli dell'implementazione, in modo che sia possibile modificarli contenendo gli effetti della modifica sul resto del programma. La classe può essere vista come il costrutto che permette di realizzare questa astrazione con un supporto strutturato da parte del linguaggio. Il primo linguaggio di programmazione orientato agli oggetti fu il [[w:Simula|Simula]] ([[w:1967|1967]]), seguito negli [[w:Anni 1970|anni '70]] da [[w:Smalltalk|Smalltalk]] e da varie estensioni del [[w:Lisp|Lisp]]. Negli [[w:Anni 1980|anni '80]] sono state create estensioni orientate ad oggetti del linguaggio [[w:C (linguaggio)|C]] ([[w:C++|C++]], [[w:Objective C|Objective C]], e altri), e di altri linguaggi ([[w:Object Pascal|Object Pascal]]). Negli [[w:Anni 1990|anni '90]] è diventato il paradigma dominante, per cui gran parte dei linguaggi di programmazione erano o nativamente orientati agli oggetti o avevano una estensione in tal senso. Oggi i linguaggi più usati tra quelli che supportano solo il paradigma di programmazione orientata agli oggetti sono Smalltalk ed [[w:Eiffel (linguaggio)|Eiffel]]. Tuttavia sono linguaggi in generale poco usati. I linguaggi più usati sono invece quelli che supportano ''anche'' il paradigma di programmazione orientata agli oggetti, come [[w:C++|C++]], [[w:Java (linguaggio)|Java]], [[w:Delphi|Delphi]], [[w:Python|Python]], [[w:C sharp|C#]], [[w:Visual Basic .NET|Visual Basic .NET]], [[w:Perl|Perl]]. Le tre proprietà principali del paradigma di programmazione ad oggetti, spesso dette anche ''pilastri'' sono: * Incapsulamento * Ereditarietà * Polimorfismo (''vedi sotto'') ==Classi== Le [[w:classe (informatica)|classi]] sono uno strumento per costruire [[w:struttura dati|strutture dati]] che contengano non solo dati ma anche il codice per gestirli. Come tutti i costrutti che permettono di definire le strutture dati, una classe definisce un nuovo [[w:tipo di dato|tipo di dato]]. I membri di una classe sono: * dati (esattamente come i membri di un [[w:Struttura dati#record o struct|record]]), chiamati '''attributi'''; * e '''metodi''', ovvero [[w:funzione (informatica)|procedure]], che operano su un oggetto. Dal punto di vista matematico, una classe definisce un [[w:insieme|insieme]] in modo intensivo, ovvero definendone le caratteristiche invece che elencandone gli elementi. Se l'accesso agli attributi è ristretto è inoltre possibile creare vincoli sui possibili valori che gli attributi possono o non puossono assumere, e anche sulle possibili transizioni tra questi stati. Un oggetto può quindi essere visto come una [[w:macchina a stati finiti|macchina a stati finiti]]. Una classe può dichiarare ''riservate'' una parte delle sue proprietà e/o dei suoi metodi, e riservarne l'uso a sé stesso e/o a particolari tipi di oggetti a lui correlati. ==Oggetti== Un [[w:oggetto (informatica)|oggetto]] è una '''istanza''' di una classe. Un oggetto occupa memoria, la sua classe definisce come sono organizzati i dati (gli attributi) in questa memoria. Ogni oggetto possiede tutti gli [[w:attributi|attributi]] definiti nella classe, ed essi hanno un valore, che può: * mutare durante l'esecuzione del programma (in questo caso l'attributo è definito '''mutabile''') * o rimanere fissi dalla creazione alla distruzione dell'oggetto (in questo caso l'attributo è definito '''immutabile'''). Un oggetto è immutabile se e solo se tutti i suoi attributi sono immutabili. Uno dei pilastri del paradigma OOP è l'incapsulamento che impone che si debba accedere agli attributi dell'istanza solo tramite metodi invocati su quello stesso oggetto. Sintatticamente, i metodi di una classe vengono invocati "su" un particolare oggetto, e ricevono come parametro implicito l'oggetto su cui sono stati invocati. Questo parametro normalmente può essere referenziato esplicitamente; per esempio, a tale scopo in [[w:C++|C++]], in [[w:Linguaggio di programmazione Java|Java]], e in [[w:C_sharp|C#]] si usa la parola chiave <code>this</code>, mentre in [[w:Smalltalk|Smalltalk]], in [[w:Objective_C|Objective-C]], [[w:Python|Python]] e in [[w:Ruby|Ruby]] si usa la parola-chiave <code>self</code>. Gli oggetti effettivamente creati sono membri dell'insieme definito dalla loro classe. Molti linguaggi forniscono un supporto per l'inizializzazione automatica di un oggetto, con uno o più speciali metodi detti [[w:costruttore (oggetti)|costruttori]]. Analogamente, la fine della vita di un oggetto può essere gestita con un metodo detto [[w:distuttore (oggetti)|distruttore]]. ==Incapsulamento== L'incapsulamento è la proprietà per cui un oggetto contiene ("incapsula") al suo interno gli attributi (dati) e i metodi (procedure) che accedono ai dati stessi. Lo scopo principale dell'incapsulamento è appunto dare accesso ai dati incapsulati solo attraverso i metodi definiti, nell'interfaccia, come accessibili dall'esterno. Gestito in maniera intelligente, l'incapsulamento permette di vedere l'oggetto come una black-box, cioè una scatola nera di cui, attraverso l'Interfaccia sappiamo cosa fa e come interagisce con l'esterno ma non come lo fa. I vantaggi principali portati dall'incapsulamento sono: '''robustezza''', '''indipendenza''' e l'estrema '''riusabilità''' degli oggetti creati... ==Ereditarietà== L'OOP prevede un meccanismo molto importante, l'[[w:Ereditarietà (informatica)|ereditarietà]], che permette di derivare nuove classi a partire da classi già definite. L'ereditarietà permette di aggiungere membri ad una classe, e di modificare il comportamento dei metodi, in modo da adattarli alla nuova struttura della classe. Da una stessa classe è possibile costruire diverse classi derivate. Da una classe derivata è possibile derivarne un'altra con lo stesso meccanismo. Sintatticamente, una classe può essere definita come '''derivata''' da un'altra classe esistente. In molti linguaggi la classe derivata, o '''sottoclasse''', '''eredita''' tutti i metodi e gli attributi della classe "genitrice", e può aggiungere membri alla classe, sia attributi che metodi, e/o ridefinire il codice di alcuni metodi. L'ereditarietà può essere usata come meccanismo per gestire l'evoluzione ed il riuso del software: il codice disponibile definisce delle classi, se sono necessarie modifiche, vengono definite delle sottoclassi che adattano la classe esistente alle nuove esigenze. ===Sottotipazione=== Se un oggetto di una sottoclasse può essere utilizzato al posto di un'istanza della superclasse, il tipo della classe derivata è detto '''sottotipo'''. Questo richiede che tutti i metodi della superclasse siano presenti nella sottoclasse, e che le signature siano compatibili. Di conseguenza, una sottoclasse che voglia definire un sottotipo può ridefinire i metodi della superclasse, ma non può eliminarli sintatticamente né modificare le loro signature. In numerosi linguaggi, invece, una sottoclasse può decidere di eliminare o cambiare le proprietà di accesso ad un metodo, il che fa sì che l'operazione di subclassing non sia corrispondente a quella di subtyping. Alcuni linguaggi ad oggetti, in particolare [[w:Sather|Sather]], dividono esplicitamente a livello sintattico subclassing e subtyping. In linguaggi con tipizzazione statica esplicita, una variabile dichiarata di tipo puntatore o riferimento ad una certa classe può fare riferimento ad oggetti sia del tipo per cui è dichiarata che di tipi da esso derivati. Il tipo effettivo della variabile viene quindi in generale definito a runtime, e può essere modificato durante l'esecuzione del programma. ===Esempio - Ereditarietà=== Se nel mio programma esiste già una classe "mezzoditrasporto" che ha come proprietà i dati di posizione, velocità, destinazione e carico utile, ed occorre una nuova classe "aereo", è possibile crearla direttamente dall'oggetto "mezzoditrasporto" dichiarando una classe di tipo "aereo" che eredita da "mezzoditrasporto" e aggiungendovi anche il dato "Quota di crociera", con il vantaggio che la nuova classe sarà sia un "aereo" che un "mezzoditrasporto", permettendo di gestire in modo omogeneo tutti i mezzi con una semplice lista di "mezziditrasporto". ==Polimorfismo== La possibilità che le classi derivate implementino in modo differente i metodi e le proprietà dei propri antenati rende possibile che gli oggetti appartenenti a delle sottoclassi di una stessa classe rispondano diversamente alle stesse istruzioni. Ad esempio in una gerarchia in cui le classi Cane e Gatto discendono dalla superclasse Animale potremmo avere il metodo cosaMangia() che restituisce la stringa "carne" se eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I metodi che vengono ridefiniti in una sottoclasse sono detti "'''polimorfi'''", in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato. In linguaggi in cui le variabili non hanno tipo, come [[w:Ruby|Ruby]], [[w:Python|Python]] e [[w:Smalltalk|Smalltalk]] è possibile richiamare un qualsiasi metodo su di un qualsiasi oggetto, sebbene ciò comporti la possibilità di errori a run-time, che in particolare sorgono quando l'oggetto non dispone del metodo che si cerca di invocare. Tali errori sono eliminabili da linguaggi puramente statici, in quanto essi vengono "scovati" già a compile-time. Le buone regole di programmazione ad oggetti prevedono che quando una classe derivata ridefinisce un metodo, il nuovo metodo abbia la stessa semantica di quello ridefinito, dal punto di vista degli utenti della classe. Nell'esempio di cui sopra, se le specifiche della classe Animale asseriscono che il metodo cosaMangia() deve restituire una stringa di non più di 20 caratteri, allora le classi Cane e Gatto dovranno rispettare tale regola. In caso contrario, un ''client'' che utilizzi un oggetto Cane o Gatto tramite il tipo Animale (faccia, cioè, l'''upcasting'' dell'oggetto) potrebbe ottenere un risultato non desiderato e ciò potrebbe generare a run-time errori difficili da scovare. ====Binding dinamico==== Il [[w:polimorfismo (informatica)|polimorfismo]] è particolarmente utile quando la versione del metodo da eseguire viene scelta sulla base del tipo di oggetto effettivamente contenuto in una variabile '''a runtime''' (invece che al momento della [[w:compilatore|compilazione]]). Questa funzionalità è detta '''binding dinamico''' (o late-binding), e richiede un grosso sforzo di supporto da parte della libreria runtime del linguaggio. Se ho una variabile di tipo A, e il tipo A ha due sottotipi (sottoclassi) B e C, che ridefiniscono entrambe il metodo m(), l'oggetto contenuto nella variabile potrà essere di tipo A, B o C, e quando sulla variabile viene invocato il metodo m() viene eseguita la versione appropriata per il tipo di oggetto contenuto nella variabile in quel momento. Per ritornare all'esempio di poco fa, supponiamo che un "aereo" debba affrontare procedure per l'arrivo e la partenza molto più complesse di un normale camion, come in effetti è: allora le procedure ''arrivo()'' e ''partenza()'' devono essere cambiate rispetto a quelle della classe base "mezzoditrasporto". Quindi provvediamo a ridefinirle nella classe "aereo" in modo che facciano quello che è necessario (polimorfismo): a questo punto, dalla nostra lista di mezzi possiamo prendere qualsiasi mezzo e chiamare ''arrivo()'' o ''partenza()'' senza doverci più preoccupare di che cos'è l'oggetto che stiamo maneggiando: che sia un mezzo normale o un aereo, si comporterà rispondendo alla stessa chiamata sempre nel modo giusto. Il ''binding dinamico'' è supportato dai più diffusi linguaggi di programmazione ad oggetti come il [[w:Java (linguaggio)|Java]] o il [[w:C++|C++]]. C'è però da sottolineare che in Java il ''binding dinamico'' è implicitamente usato come comportamento di default nelle classi polimorfe, mentre il C++ per default non usa il ''binding dinamico'' e se lo si vuole utilizzare bisogna inserire la keyword '''virtual''' nella signature del metodo interessato. Il supporto runtime di una chiamata di metodo polimorfa richiede che ad una variabile polimorfa venga associato un metadato implicito che contiene il tipo del dato contenuto nella variabile in un dato momento, oppure la tabella delle funzioni polimorfe. ==Diversi approcci all'OOP== {{...}} ===Problemi dei linguaggi OOP=== Un linguaggio OOP può soffrire di problemi di efficienza se l'approccio OOP viene applicato a tutto indiscriminatamente, come avviene nel linguaggio [[w:Smalltalk|Smalltalk]] che utilizza gli oggetti anche per i tipi primitivi. Un approccio che per alcuni appare più pratico e realista è quello adottato da linguaggi come [[w:Linguaggio di programmazione Java|Java]] e [[w:C++|C++]] che limitano la creazione di oggetti alle sole entità che il programmatore decide di dichiarare come tali più eventualmente una serie di oggetti predefiniti, per lo più riguardanti il sistema. In questo modo tali linguaggi restano efficienti, ma l'uso degli oggetti creati richiede più attenzione e più disciplina. Non esistono al momento dati validi che permettano di dimostrare con certezza che uno dei due approcci sia intrinsecamente migliore dell'altro. Inoltre il fatto di ridefinire i metodi ereditati dalle classi base può portare a introdurre errori nel programma se per caso questi sono usati all'interno della classe base stessa (il noto [[w:problema della classe base fragile|problema della classe base fragile]]). == Collegamenti esterni == * [http://www.bluej.org bluej: Ambiente di sviluppo open source per l'insegnamento della programmazione ad oggetti (in Java)] *[http://www.python.org Python], un potente linguaggio ad oggetti. [[w:Categoria:Linguaggi di programmazione|Categoria:Linguaggi di programmazione]] cp4wq15m24b2zsys32ngdqaqafue3a8 Protocolli di autenticazione 0 7681 259475 254977 2022-07-19T13:43:18Z Eumolpo 11994 ortografia wikitext text/x-wiki Un protocollo crittografico è un algoritmo distribuito che viene eseguito da <math>n</math> soggetti, con <math>n \ge 2</math>, che indica quali azioni devono essere fatte per raggiungere un certo tipo di sicurezza. Il protocollo crittografico indica come usare un algoritmo crittografico, al fine di ottenere * autenticazione; * confidenzialità; * protezione dell'integrità dei dati; * ... == Autenticazione == L'autenticazione può essere orientata in due direzioni: * autenticazione dei messaggi; * autenticazione dei nodi. L'autenticazione dei messaggi consiste nell'avere una prova dell'origine da cui arrivano i messaggi ed una prova dell'integrità dei messaggi stessi. Questo risultato può essere raggiunto attraverso una funzione di [[w:Message authentication code|MAC]], che si occupa di fare da [[Funzioni di hash|MDC]], ma con una chiave: l'MDC verifica la correttezza del messaggio ricevuto, la chiave verifica la sorgente del messaggio. A questa autenticazione si può aggiungere anche la proprietà di non ripudio, per la quale sono nate le firme digitali. Una proprietà fondamentale di tutto questo è che non è necessario che l'autenticazione avvenga in ''real time'', può anche essere rimandata per un tempo indefinito. Al contrario, l'autenticazione dei nodi è quell'autenticazione che mira a far sì che un soggetto (un nodo) possa riconoscere un altro soggetto e verificarne l'identità. Nel primo caso, io verifico che il messaggio è giunto da una persona che possiede una chiave, nel secondo caso verifico che è effettivamente Bob la persona con cui io voglio comunicare. È fondamentale, in questo caso, che la verifica possa essere fatta in diretta. Noi ci occuperemo principalmente dell'autenticazione dei nodi, più che dei messaggi. L'autenticazione è quel processo che permette ad Alice di verificare che la persona con cui sta comunicando sia effettivamente Bob, e non Trudy: serve una qualche forma di prova che faccia capire ad Alice che Bob è veramente Bob. L'autenticazione può essere mutua oppure no, dipende dalle situazioni. Un caso di autenticazione mutua è quando io voglio vedere la mia posta elettronica: * il server si deve autenticare a me, dandomi una prova del fatto di essere veramente il server a cui io voglio collegarmi; * io devo dare al server una prova di chi sono io, tipicamente attraverso un nome utente ed una password. Un caso in cui non è necessaria autenticazione mutua, per esempio, è quando io voglio fruire di un contenuto come può essere un giornale on-line: devo essere sicuro che il giornale sia effettivamente quello che voglio leggere, mentre al server non interessa sapere chi sono io. Una proprietà importante della prova di autenticazione è la non trasferibilità: Alice non dovrebbe essere in grado di usare la prova fornita da Bob, cioè Alice non dovrebbe essere in grado di andare da Charlie e convincerlo di essere Bob. Lo stesso protocollo di autenticazione, infine, deve minimizzare la possibilità che qualcuno come Trudy possa impersonare qualcun altro. Questa proprietà deve rimanere valida anche quando * Trudy può leggere gli scambi di dati tra Alice e Bob che si stanno autenticando; * Trudy può fare un numero infinito di tentativi di autenticazione con Alice o con Bob, facendo finta di essere Bob o Alice; * Alice e Bob stanno eseguendo più di un'autenticazione contemporaneamente. == Classificazione dei protocolli di autenticazione == I protocolli di autenticazione si distinguono tra loro in base alle funzionalità che possono offrire, come per esempio l'autenticazione mutua piuttosto che l'autenticazione del percorso, eccetera. Un altro parametro importante è la complessità degli algoritmi che sono necessari per eseguire un'autenticazione, così come la quantità di dati che è necessario scambiarsi. Infine, i protocolli si differenziano tra quelli che hanno bisogno di una figura terza per l'autenticazione (un garante super-partes), oltre che per il tipo di credenziali che sono necessarie, la dimensione di queste credenziali, per come queste credenziali devono essere usate e gestite. == Dimostrazioni d'identità == Perché Alice possa riconoscere Bob, quest'ultimo deve dimostrare di sapere o possedere qualcosa. Per esempio, Bob deve conoscere un [[w:PIN|PIN]], una [[w:Password|password]], una chiave simmetrica oppure la versione privata di una coppia di chiavi asimmetriche. Nel caso invece di possesso, possiamo parlare di [[w:Smart-Card|smart card]], oppure di ''calcolatori crittografici'', degli oggetti che forniscono una password utilizzabile una sola volta. Infine, per l'autenticazione si può ricorrere anche a caratteristiche biometriche di Bob (se è una persona), quali per esempio * il timbro della voce; * l'impronta digitale; * il fondo dell'occhio; * la forma dell'orecchio; * le caratteristiche del viso; * ... Ci sono tre classi di protocolli di autenticazione: * basati su password; * basati su ''challenge-response''; * basati su una prova che non prevede alcuna conoscenza a priori, ''zero-knowledge proof''. === Autenticazione tramite password === I protocolli basati sull'utilizzo di una password sono estremamente comuni, dal momento che la password è una prova molto semplice da ricordare e da usare. I protocolli che si basano su password sono insicuri quando * la password non può essere cambiata, oppure non cambia con una frequenza sufficiente; * le password usate sono passibili di [[w:Attacco a dizionario|attacco a dizionario]], online o, peggio ancora, offline; * la password viene trasmessa o salvata in chiaro. ==== Password Authentication Protocol ==== Il PAP è un protocollo usato esclusivamente dal protocollo [[w:Point-to-Point Protocol|PPP]]; si presume che il canale di trasmissione sia sicuro (una linea telefonica telecom, per esempio, viene considerata come non-intercettabile). [[Immagine:sicurezza_PAP.png]] Alice manda al server di autenticazione AS (Bob) il suo nome utente e la sua password. Il server di autenticazione conosce * il nome utente di Alice; * una ''trasformazione'' <math>h</math> della password; * un numero casuale di bit, detto ''salt''. Quello che viene fatto dal server di autenticazione è andare a cercare, in una tabella, il nome utente di Alice. Se il nome utente viene trovato, si preleva il ''salt'' e lo si usa all'interno di una funzione di MDC <math>f(\cdot)</math>: :<math>h' = f(password|salt)</math> Alla fine, viene fatto un confronto tra il risultato della funzione e la trasformazione in memoria e, se i numeri sono uguali, l'autenticazione ha successo. Il ''salt'' è un numero casuale che ha lo scopo di rendere gli attacchi a dizionario più difficili, perché grazie al ''salt'', anche se due utenti hanno la stessa password, difficilmente avranno lo stesso ''salt'' e quindi la stessa trasformazione <math>h</math> della password. Il database viene conservato in questa forma per evitare che le password siano facilmente recuperabili dal disco del server nel caso di furto o manomissione. Questo protocollo di autenticazione soffre di diversi problemi: * attacco ''man-in-the-middle'' efficacissimo; * il canale è considerato sicuro, ma lo è davvero? * il server di autenticazione riceve nome utente e password in chiaro, quindi è in grado di fingersi Alice con un altro server: trasferibilità; * le password del database sono sensibili ad un attacco a dizionario. Quindi, concludendo, PAP non deve assolutamente essere usato, a meno che non venga usato per lo meno in un tunnel cifrato. ==== Challenge Handshake Authentication Protocol ==== Il CHAP è una variante del protocollo PAP, ed è usata in alcune implementazioni di PPP ed in Microsoft Windows. [[Immagine:sicurezza_CHAP.png]] Quello che accade con CHAP è che la funzione di trasformazione viene eseguita sia da Alice che dal server AS. Il server di autenticazione chiede ad Alice di usare, come ''salt'', un numero casuale <math>c</math>: sarà poi Alice a mandare al server la trasformazione <math>r</math>. Il server, a sua volta, usa <math>c</math> per calcolare la sua trasformazione <math>r'</math> e soltanto se i risultati delle due trasformazioni saranno uguali, allora l'autenticazione andrà a buon fine. L'implementazione standard di CHAP usa :<math>r=MD5(user|password|c)</math> Problemi di CHAP sono: * attacco a dizionario con <math>r</math> (cioè, l'AS non è in realtà chi dice di essere); * il database delle password deve essere salvato in chiaro; * se <math>c</math> non è un numero casuale, sono possibili i ''replay attack'', cioè Trudy può riutilizzare l'<math>r</math> registrato per autenticarsi a sua volta. Ancora una volta, CHAP non deve essere usato a meno che i dati non vengano fatti transitare su un tunnel cifrato. ==== One-time password ==== Questo protocollo è stato pubblicato nel 1981 ad opera di [[w:Leslie Lamport|Leslie Lamport]]. Funziona esattamente come il CHAP, soltanto che <math>c</math> non è più un numero casuale, ma diventa un numero progressivo <math>n</math>. [[Immagine:sicurezza_one-time_password.png]] Definiamo <math>f^n(\cdot)</math> come la funzione MDC eseguita per <math>n</math> volte: :<math>h^n = f^n(\cdot) = MCD(MDC(MDC( \cdots )))</math> <math>n</math> volte Definiamo <math>y</math> il numero residuo di volte in cui sarà possibile usare la password. Alice deve mandare al server di autenticazione il valore :<math>h^y = f^y(password)</math> A tutto questo, di solito viene aggiunto un numero di ''salt'' per non dover salvare in chiaro il database delle password. Con questo protocollo, la trasferibilità delle credenziali viene limitata ad una sola autenticazione: Trudy può far finta di essere il server e rubare le credenziali corrette, ma queste saranno valide una volta soltanto. Tutti i protocolli che abbiamo visto finora, inoltre, hanno un difetto sostanziale: non prevedono la possibilità di fare autenticazione mutua, una funzione molto spesso importante. ==== Encrypted Key Exchange ==== Il protocollo [[w:Encrypted Key Exchange|EKE]] si propone di estendere il protocollo [[Criptosistemi_asimmetrici#Il_protocollo_Diffie-Hellman|Diffie-Hellman]], introducendo l'autenticazione sulla chiave che si calcola. [[Immagine:sicurezza_EKE.png]] Alice manda a Bob un numero <math>A</math> che contiene la versione cifrata di <math>g^{Sa}\mod{p}</math>, dove la chiave di cifratura <math>w</math> è la trasformazione MDC di una password condivisa. :<math>A = E_w(g^{Sa}\mod{p})</math> Bob, che riceve il messaggio di Alice, sceglie a sua volta un numero <math>Sb</math> con cui calcolare la grandezza :<math>g^{Sb}\mod{p}</math> e sceglie anche un numero casuale <math>c_1</math>. Alice, grazie al messaggio di Bob, sarà in grado di calcolare la chiave effimera <math>K</math>, esattamente come Bob, con cui cifrare un altro messaggio di risposta che contiene il numero casuale scelto da Bob ed un altro numero casuale, scelto da Alice. Se Bob ha ricavato la chiave <math>K</math> corretta, sarà in grado di decifrare il messaggio e di cifrarne uno nuovo, contenente soltanto il numero che ha scelto Alice. In questa maniera, si è ottenuta autenticazione mutua ed il setup di chiavi effimere simmetriche, utilizzabili per cifrare i messaggi successivi. Questo algoritmo gode anche di resistenza ad attacchi ''off-line'', perché anche decifrando i messaggi scambiati da Alice e Bob, non si ottengono che numeri casuali ed effimeri, già dimenticati dai due soggetti. L'unico problema è che sia Alice che Bob devono possedere la password e, se Bob è un server di autenticazione, avrà nella sua memoria le password in chiaro di tutti i suoi utenti. === Autenticazione tramite ''challenge'' === Una ''challenge'' è un numero scelto da uno dei due soggetti partecipanti all'autenticazione. Questo numero deve essere firmato dall'altro soggetto, Alice, attraverso un MAC. Bob autentica Alice non tanto sulla challenge, ma sul valore del MAC calcolato, che non può essere corretto se la chiave usata è sbagliata. La principale innovazione di questo tipo di protocolli è che Alice non deve svelare a nessuno, almeno durante l'autenticazione, il suo segreto <math>s</math>. Il segreto di Alice può essere qualsiasi cosa: una password, per esempio, ma anche la versione privata di una coppia di chiavi asimmetriche, oppure una chiave simmetrica condivisa. ==== La challenge ==== La challenge è di primaria importanza; deve sempre essere fresca, non deve esser mai stata usata: se così non fosse, gli attacchi di tipo ''replay'' diventerebbero facilissimi. La challenge può essere: * una ''nonce'', cioè un numero casuale usato una sola volta; * un numero di sequenza, cioè un contatore che continua ad aumentare ad ogni ciclo di autenticazione; * un ''timestamp'', un'informazione sul tempo. Usare un numero di sequenza o il tempo permette di evitare che la challenge circoli nella rete e possa essere intercettata, però il protocollo diventa più difficile da implementare: * nel caso dei numeri di sequenza, questi devono essere uguali per Alice e Bob, il che non è banale (se Alice usa computer diversi?); * nel caso del tempo, il problema è che gli orologi di Alice e Bob devono essere sincronizzati, cosa se non altro costosa. ==== Il segreto <math>s</math> ==== Il segreto <math>s</math> è un numero, protetto attraverso meccanismi crittografici, che viene condiviso tra Alice e Bob. Questo numero può essere statico oppure il risultato di algoritmi di cifratura o di MAC. Il problema principale sta nella gestione di questi segreti, che deve essere fatta in maniera sicura: servono algoritmi per generare questi segreti ed algoritmi di cifratura per mantenere questi segreti davvero segreti. Purtroppo, la non trasferibilità è ancora un risultato lontano, anche con questi algoritmi. Una variante può essere quella di avere dei segreti che non vengono condivisi tra i soggetti che si vogliono autenticare, ma vengono condivisi con un soggetto terzo, un server di autenticazione <math>Z</math> che autentica sia Alice che Bob e dà loro la garanzia di essere veramente chi dicono di essere. [[Immagine:RSA SecurID SID800.jpg|thumbnail|right|400px|RSA SecurID SID800]] Per venire incontro al problema del segreto, RSA ha lanciato un prodotto commerciale discretamente utilizzato, chiamato [[w:SecurID|''SecurID'']]: si tratta di un calcolatore, delle dimensioni di una chiave, che mostra un numero variabile nel tempo. Questo numero è sincronizzato con il server, ed è la nostra chiave di cifratura, anch'essa, a questo punto, effimera. ==== ISO/IEC 9798-2/4 ==== Gli standard [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-2]] e [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-4]] indicano due metodi di autenticazione del tipo ''challenge-response'', cioè un'autenticazione in cui il server chiede all'utente di firmare qualcosa, una ''challenge''. Questi protocolli sono basati: * sul tempo <math>t</math>; * su numeri random o contatori. Nel caso di protocolli basati sul tempo <math>t</math>, basta che Alice mandi un messaggio a Bob con i dati corretti perché venga accettata l'autenticazione; si tratta di un protocollo molto semplice e che permette l'utilizzo ottimale della rete: un solo piccolo messaggio per ottenere ciò che si vuole. [[Immagine:sicurezza_autenticazione_tempo.png]] Alice manda in chiaro la sua login <math>A</math>, e manda le informazioni sul tempo e sull'identità di Bob, cifrate con una chiave condivisa <math>s</math>: :<math>R = E_S(t,B)</math> Quello che deve fare Bob è controllare se il nome utente è corretto, decifrare il messaggio e verificare che l'istante di tempo sia compreso in un intorno accettabile :<math>t-x < t' < t+x</math> Nel caso di protocolli basati su ''nonces'', cioè su numeri casuali validi una volta sola, la complessità del protocollo cresce, ma è possibile anche fare autenticazione mutua. [[Immagine:sicurezza_autenticazione_nonces.png]] Ad iniziare la comunicazione, questa volta, è Bob, che manda ad Alice un numero casuale <math>c_1</math> e la sua identità. Alice risponde a questo messaggio con un nuovo messaggio in cui inserisce * il suo nome utente * il numero <math>R_A=E_s(c_1,c_2,B)</math> dove <math>R_A</math> contiene la ''nonce'' scelta da Bob, una ''nonce'' scelta da Alice e l'identità di Bob, tutto cifrato con una chiave condivisa <math>s</math>. A questo punto, Bob manderà ad Alice un messaggio di risposta con un numero :<math>R_B = E_s(c_2,c_1,A)</math> in modo tale che Alice abbia la conferma che Bob ha ricevuto il suo messaggio e vuole davvero parlare con lei. In questa maniera, il protocollo permette mutua autenticazione e previene anche la possibilità di ''replay attacks'', gli attacchi fatti mandando ad un utente i messaggi di login corrette registrate in passato. === Autenticazione con algoritmi asimmetrici === Vogliamo fare un ulteriore passo in avanti nella sicurezza, andando ad utilizzare le chiavi di cifratura asimmetrica come segreto per l'autenticazione. In questa maniera, il segreto di Alice non deve più essere condiviso con nessuno, basta che Bob o il server di autenticazione abbiano la chiave pubblica di Alice. Un passo in più può essere quello di adottare i certificati digitali. Questi altro non sono che dei documenti in cui un ente terzo, una ''Certification Authority CA'', dichiara che la chiave pubblica di Alice è effettivamente associata alla persona Alice, con tutta una serie di informazioni sul suo conto. I principali problemi che ci sono, nell'utilizzo di questo tipo di credenziali, sono * l'autenticazione delle chiavi pubbliche (perché le ''Certification Authority'' fanno il loro lavoro, sì, ma a pagamento); * complessità computazionale elevata. Un esempio semplice di utilizzo delle chiavi asimmetriche. Alice manda la sua login al server di autenticazione Bob, il quale risponde mandando la sua identità, una challange cifrata con la chiave pubblica di Alice e l'MDC della stessa challange. [[Immagine:sicurezza_esempio_autenticazione_chiavi_asimmetriche_challange.png]] L'autenticazione andrà a buon fine solo se Alice sarà in grado di mandare la challange corretta al server di autenticazione, in una qualche maniera (in chiaro, oppure cifrata con la chiave pubblica del server). Per la sicurezza della coppia di chiavi, è sempre bene assicurarsi che le implementazioni di autenticazione siano aderenti agli standard di sicurezza come il [[Criptosistemi_asimmetrici#Public_Key_Cryptograpy_Standard|PKCS]]. ==== ISO/IEC 9798-3 ==== Lo standard [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-3]] definisce un protocollo di autenticazione basato sulla crittografia asimmetrica e sulle firme digitali. Può essere basato sul tempo oppure su ''nonce''. Nel caso in cui si voglia usare il tempo, si ha autenticazione singola e massima efficienza di banda, perché si manda un solo messaggio che contiene: * la login di Alice; * il tempo <math>t</math>; * il destinatario del messaggio, Bob; * la firma sul numero <math>(t,Bob)</math> [[Immagine:sicurezza_autenticazione_iso_iec_9798_3_timestamp.png]] Nel caso di autenticazione con ''nonce'', invece, si può ottenere autenticazione mutua. Si ha: [[Immagine:sicurezza_autenticazione_iso_iec_9798_3_nonce.png]] * Bob manda ad Alice un messaggio contenente la sua identità è la ''nonce'' che ha scelto lui, <math>c_1</math>; * Alice risponde mandando la sua identità, quella di Bob, la sua ''nonce'' <math>c_2</math> e la firma su <math>(c_1,c_2,B)</math>; * Bob chiude il protocollo mandando l'identità di Alice e la sua firma sulla grandezza <math>(c_2,c_1,A)</math>. il fatto che anche Alice possa scegliere la sua challenge è importante, perché impedisce che Alice debba firmare un numero casuale senza saperne il motivo: magari sta ponendo la sua firma sull'MD5 di un messaggio che non ha mai scritto, senza saperlo. === ''Zero-knowledge proof'' === L'idea che sta alla base di questo tipo di autenticazione è che Bob, dopo aver autenticato Alice, non avrà nessuna ulteriore informazione sul segreto di Alice. Alice non rivelerà a Bob nulla che lui non sapesse già su Alice. Per far questo, bisogna introdurre la nozione di ''autenticazione in probabilità'': ad ogni scambio di messaggi, Bob ha una sicurezza sempre crescente sulla vera identità di Alice; ovviamente, la probabilità deve approssimarsi al 100% velocemente. ==== Protocollo Fiat-Shamir ==== {{Matematica voce|Teorema||Calcolare la radice quadrata di un numero <math>\mod{n}</math> è tanto complesso quanto sarebbe fattorizzarlo.}} Si parte dal presupposto che Bob, attraverso un canale sicuro, abbia alcune informazioni su Alice: * la sua login; * un numero <math>n</math> grande; * un altro numero <math>v = s^2\mod{n}</math>, dove <math>1<s<n</math> è un numero casuale coprimo con <math>n</math>. [[Immagine:sicurezza_fiat_shamir.png]] Per l'autenticazione, Alice manda a Bob un numero <math>x_i</math> definito come: :<math>x_i = r_i^2 \mod{n}</math> dove <math>1<r<n</math> è un numero casuale e coprimo con <math>n</math>. Bob risponde a questo messaggio con un numero <math>e_i = rand(\{0,1\})</math>, da cui Alice ricava e spedisce il numero :<math>y_i = r_i \cdot s^{e_i}\mod{n}</math> L'identità viene confermata se: * con <math>e_i = 0</math>, il risultato è stato :<math>y_i^2 = x_i \mod{n}</math> * con <math>e_i = 1</math>, il risultato è stato :<math>y_i^2 = x_i \cdot v \mod{n}</math> Con questo tipo di protocollo, Trudy è in grado di ingannare Bob soltanto dopo aver registrato una sessione di login e soltanto sotto l'ipotesi che Bob richieda la stessa identica sequenza di valori<math>e_i</math>: di conseguenza, Bob non deve mai chiedere più volte la stessa sequenza, altrimenti c'è il rischio che Trudy possa fare un ''replay attack''. Se la sequenza di <math>e_i</math> cambia, allora Trudy avrà ogni volta il 50% di probabilità di indovinare il risultato corretto; di conseguenza, la probabilità che Trudy possa riuscire a fare login è <math>2^{-i}</math>. In genere, un numero di ripetizioni <math>i</math> considerato sufficiente è attorno alle 30, 40 volte, sia perché è difficile da registrare, sia perché si ha un numero di permutazioni della sequenza degli <math>e_i</math> sufficiente a impedire ''replay attack'', che avrebbero probabilità di successo 100%. == Classificazione degli attacchi == === Registrazione, ''sniffing'' === È un attacco di tipo passivo, il più semplice di tutti ed il più probabile: Trudy si inserisce della linea di comunicazione tra Alice e Bob e registra tutto quello che viene trasmesso. È il primo attacco che verrà fatto, sempre. Bisogna quindi porre particolare attenzione quando si decide di usare un protocollo semplice come il PAP, perché bisogna partire dal presupposto che questo attacco è sempre possibile (lo è nella realtà, sempre): il server di autenticazione ''AS'' può essere corrotto, l'intruso attiva un servizio come [[Protocolli di autenticazione#Collegamenti esterni|tcpdump]] e registra tutte le credenziali che arrivano al server, senza nemmeno doversi preoccupare di andarle a cercare nel database, senza doversi immettere in nessuna connessione cifrata. Come conseguenza di questo attacco, tutto quello che può fare Trudy è cercare di calcolare le credenziali di Alice e Bob, come le password o le chiavi private. Altrimenti, se Trudy diventa un attaccante attivo, può cercare di impostare un ''replay attack'', immettendo nella rete i pacchetti che ha registrato e cercando di far credere a Bob di parlare con Alice o viceversa. Per ovviare a questi problemi, bisognerebbe sempre inserire, all'interno del protocollo che si vuole creare, un legame tra le identità dei partecipanti ed il tempo, oppure usare delle ''challange'' casuali. È importante proteggere non solo se stessi, ma anche le credenziali di chi si dovrà poi collegare al nostro server. === Lettura del database === Un attacco solo poco più complicato dello ''sniffing'', perché è necessario avere accesso al calcolatore di Alice o di Bob; questo può essere fatto attraverso dei [[w:Malware|malware informatici]], oppure avendo accesso fisico, rubando o semplicemente consultando l'hard disk non solo di Alice, ma anche del server di autenticazione. Per questo, è fondamentale che le password e tutti i documenti come le chiavi private vengano cifrati, perché è l'unico modo per proteggerli da un attacco al database. === Falsa identità === Con questo tipo di attacco, Trudy è in grado di intercettare i messaggi tra Alice e Bob, ed ha il tempo per modificarli. Allora, Trudy chiederà ad Alice di fare le trasformazioni per conto suo. I protocolli che prevedono di firmare soltanto delle ''challange'' sono i più esposti a questo tipo di attacco. Nel caso di credenziali simmetriche, Trudy potrebbe voler derivare le credenziali di Alice o di Bob, quindi potrebbe sottoporre loro delle challange apposite, pensate per ridurre al minimo lo sforzo (attacco di tipo ''chosen text''). Se poi le credenziali sono asimmetriche, allora Trudy potrebbe cercare di derivare le chiavi private, oppure potrebbe sottoporre una challange che in realtà non è soltanto un semplice numero casuale: potrebbe essere il digest di un documento, al quale Alice appone la sua firma facendone il MAC. A questo punto, Trudy ha un documento firmato da Alice. Alcune regole per evitare problemi di questo tipo sono: * il protocollo deve prevedere un padding casuale scelto sia da Alice che da Bob: Alice non deve essere costretta a firmare tutto quello che le si chiede di firmare; * usare protocolli che mettono in gioco anche il fattore tempo; * usare sempre credenziali diverse per i diversi servizi: una chiave privata può essere usata sia per fare login su servizi che per firmare documenti, ma viene esposta a due rischi diversi. === Attacchi a specchio === Sono degli attacchi che prevedono l'inizializzazione di più sessioni in parallelo. Un esempio: [[Immagine:sicurezza_esempio_attacco_a_specchio_ok.png]] Il protocollo d'esempio prevede che Alice mandi a Bob una challange <math>c_1</math>, Bob firma la challange e chiede ad Alice di firmarne una a sua volta, <math>c_2</math>. Ma cosa succede se Iniziamo una seconda sessione? [[Immagine:sicurezza_esempio_attacco_a_specchio_fregato.png]] Trudy inizia una sessione esattamente come farebbe Alice: Bob firma <math>c_1</math> e chiede di firmare <math>c_2</math>. A questo punto, Trudy può iniziare una nuova sessione, chiedendo a Bob di firmare <math>c_2</math> al posto di <math>c_1</math>: è una richiesta legittima, Bob risponderà con la firma di <math>c_2</math> ed una nuova challange <math>c_3</math>. A questo punto, Trudy può portare a compimento la prima sessione di login, perché è entrata in possesso della firma corretta per <math>c_2</math>, senza conoscere la chiave <math>K</math>. Attacchi di questo tipo sono evitabili: * usando credenziali diverse nelle due direzioni, come la crittografia asimmetrica, oppure crittografia simmetrica ma con due chiavi per le due diverse direzioni (Alice cifra i messaggi per Bob con <math>k_1</math> e Bob risponde ad Alice con <math>k_2</math>); * imponendo che sia il server di autenticazione a fare la prima richiesta; * eliminando le simmetrie nei messaggi, per esempio usando imponendo di fare il MAC di entrambi i ''nonce'', anziché soltanto uno. === Attacco ad intermediario === Trudy può iniziare due autenticazioni, una con Alice ed una con Bob. Prendiamo un protocollo di esempio: [[Immagine:sicurezza_esempio_attacco_intermediario_ok.png]] Trudy può attaccare il protocollo in questa maniera: [[Immagine:sicurezza_esempio_attacco_intermediario_fregato.png]] cioè, chiedendo ad Alice di firmare, nuovamente, i dati al posto di Bob. Se questa cosa può sembrare strana, si consideri la possibilità che sia Alice che Bob siano due server che cominicano in automatico, entrambi potrebbero voler aprire una connessione verso l'altro. Questo attacco può essere evitato chiedendo di firmare sempre tutte le challange in successione, cioè imponendo, al posto di <math>MAC_k(c_2,c_4)</math>, che venga firmato <math>MAC_k(c_2,c_1)</math>. == Chiavi effimere ed autenticazione == Vogliamo derivare delle chiavi temporanee da usare per uno scambio di dati; queste chiavi temporanee devono essere ''autenticate esplicitamente'', cioè ci deve essere la sicurezza assoluta che soltanto i soggetti che fanno parte del gruppo di lavoro, e che si sono autenticati, le conoscano davvero. Genericamente, i soggetti possono essere anche più di due. L'autenticazione dei soggetti che hanno diritto a conoscere la chiave è strettamente legata all'autenticazione delle chiavi effimere che, generalmente, vengono derivate da tutti durante la fase di autenticazione. È quindi il protocollo di autenticazione dei soggetti a doversi occupare della derivazione delle chiavi effimere autenticate. Le chiavi effimere, o temporanee, sono l'opposto delle ''chiavi master'', o chiavi di lungo periodo. Se le chiavi effimere devono essere cambiate ad ogni autenticazione (o anche più spesso), le chiavi di lungo periodo sono quelle chiavi, tipicamente asimmetriche, che servono per autenticare i soggetti all'interno di una sessione cifrata. L'utilizzo delle chiavi di lungo periodo in maniera intensiva, oltre ad essere computazionalmente più oneroso, espone le chiavi stesse, perché aumenta la quantità di dati che possono essere analizzati, da cui si può potenzialmente ricavare la chiave privata; al contrario, usare chiavi effimere permette di usare algoritmi di cifratura simmetrici, quindi meno computazionalmente onerosi, e permette che le chiavi siano cambiate molto più spesso, limitando quindi la quantità di testo cifrato che è possibile analizzare. Inoltre, se viene scoperta una chiave temporanea, saranno disponibili all'attaccante soltanto una quantità di dati limitata, mentre se si usasse la chiave di lungo periodo, una volta scoperta, esporrebbe tutti i dati alla decifratura, fatto sgradevole. Un altro motivo per cui usare le chiavi effimere è che queste possono essere più di una, in sessioni diverse, anche contemporaneamente: Alice può parlare in segretezza con più persone, senza che ognuno di loro possa leggere i dati che Alice scambia con gli altri. === Perfect Forward Secrecy === La PFS è la ''sicurezza perfetta nel futuro'', cioè la garanzia che, una volta cancellate le chiavi effimere, anche se qualcuno scopre la chiave di lungo periodo, non ha alcuna informazione aggiuntiva sulle chiavi temporanee e, quindi, non potrà comunque leggere le informazioni protette con chiavi temporanee. Un esempio di algoritmo che offre PFS è [[Protocolli di autenticazione#Encrypted Key Exchange|EKE]], mentre qualsiasi protocollo che prevede di scambiarsi le chiavi cifrandole con la chiave master non offre alcuna garanzia di PFS, perché le chiavi saranno recuperabili dalla registrazione. Ovviamente, la PFS offre garanzie per il passato, ma non per il futuro: una volta che la chiave privata di Alice è stata compromessa, Trudy potrà comunque far credere agli altri di essere Alice. La ''forward secrecy'', invece, è quella proprietà del protocollo che, se una chiave effimera viene scoperta, nulla si sa su tutte le altre chiavi effimere. Infatti, anche se Trudy è in grado di calcolare una o più chiavi effimere, questo non la deve aiutare nel calcolo delle chiavi effimere successive o precedenti, né tantomeno per il calcolo della chiave privata di Alice o di Bob. Questa proprietà è molto importante, perché di solito le chiavi effimere sono meno protette delle chiavi di lungo periodo: * vengono condivise tra più persone; * non vengono salvate in forma cifrata; * sono usate per cifrare grandi quantità di dati, quindi sono più esposte alla crittanalisi. Di conseguenza, è più probabile che venga scoperta una chiave effimera piuttosto che la chiave di lungo periodo, quindi è importante che da questa non si riesca a risalire alla chiave di lungo periodo, né alle chiavi temporanee future o passate. === Setup delle chiavi effimere === Le chiavi effimere possono essere decise da un singolo soggetto, oppure essere calcolate in parallelo da tutti i partecipanti alla sessione protetta. Nel caso in cui la chiave venga decisa unilateralmente da un'entità, allora questa chiave dovrà essere cifrata con le credenziali di lungo periodo, in modo tale che gli utenti della sessione cifrata la possano ricevere in maniere sicura, senza che qualcuno possa leggerla. In questa manieral, la chiave temporanea viene protetta soltanto dalla chiave di lungo periodo. Nel caso, invece, in cui le chiavi vengano calcolate in parallelo da tutti i partecipanti alla sessione cifrata, allora tutti dovranno immettere il loro contributo affinché la chiave possa essere generata; questa chiave, quindi, non dovrà circolare nella rete, non dovrà essere protetta, quindi non ci sarà il pericolo che venga recuperata a partire dalle registrazioni di una sessione di comunicazione. Questo secondo approccio è più pesante del primo, dal punto di vista computazionale, ma offre la PFS ed è meno esposta a ''replay attack''. ==== Chiave trasportata nella rete ==== La chiave temporanea <math>K_t</math> può essere semplicemente decisa da Alice e poi comunicata a Bob in forma cifrata, usando la chiave master <math>K</math> per cifrare la chiave temporanea. Se, assieme alla chiave, cifriamo anche il nome del destinatario, allora si impedisce che quello stesso messaggio possa essere usato per fare un ''replay attack'' contro Alice; questo attacco resta comunque possibile nei confronti di Bob, oltre al fatto che manca totalmente la PFS. [[Immagine:sicurezza_chiave_trasportata.png]] Per ovviare ai ''replay attack'', si può imporre che sia Bob a comunicare ad Alice un numero <math>n</math> ''nonce'', in modo da rendere univoco il messaggio cifrato. [[Immagine:sicurezza_chiave_trasportata_nonce.png]] Aggiungendo poi le firme digitali, si ha un'autenticazione ancora più forte del messaggio. ==== Key Distribution Center ==== La distribuzione delle chiavi effimere per <math>n</math> nodi prevede che ognuno di questi nodi conosca <math>(n-1)</math> chiavi pubbliche, una per ogni altro partecipante alla sessione cifrata. Questo fatto è un problema, al crescere di <math>n</math>. Per ovviare a questo problema nascono i ''Key Distribution Center KDC'', i centri per la distribuzione delle chiavi effimere. Grazie al KDC, ogni nodo della rete protetta deve conoscere soltanto le credenziali proprie e del KDC, mentre il KDC stesso si incarica di tener traccia delle credenziali di tutti i nodi della rete protetta. Questo fa sì che il KDC sia un elemento fondamentale della rete, deve essere un nodo di fiducia per tutti coloro che si attestano alla rete, perché è l'unico vero intermediario tra i nodi deputato all'autenticazione di ogni singolo nodo e alla comunicazione delle chiavi temporanee. Usare un KDC è sicuramente un vantaggio nelle reti di grandi dimensioni, dove la scalabilità è importante. Infatti, aggiungere un nodo ad una rete di 1000 computer è tanto semplice con un KDC tanto è difficile in una rete distribuita. Inoltre, se un singolo nodo viene compromesso, il KDC dovrà aggiornare soltanto le sue credenziali, mentre in una rete distribuita tutti devono essere informati della nuova chiave pubblica e del fatto che quella vecchia non deve più essere usata. Al contrario, il KDC diventa un nodo nevralgico per la sicurezza di tutta la rete: se questo viene a mancare o se questo è sottodimensionato, rischia di diventare un collo di bottiglia per tutta la rete. Un esempio di implementazione di un KDC è il [[w:Protocollo_Kerberos|protocollo Kerberos]]; analizziamo, in maniera semplificata, ''Kerberos v5''. [[Immagine:sicurezza_kerberos_v5.png]] Supponiamo che Alice voglia parlare con Bob: dovrà quindi mandare al KDC un messaggio che contenga il suo username, lo username di Bob, ed un numero <math>n</math> come ''nonce''. Il server KDC risponderà ad Alice con due ''ticket'', due biglietti che contengono le credenziali per lei e per Bob: sarà Alice a dover comunicare a Bob le sue credenziali per poter iniziare la connessione cifrata. Tutte le chiavi che vengono rilasciate dal server kerberos devono essere usate entro un certo tempo, definito tal numero <math>L</math>. Opzionalmente, Alice e Bob possono usare questa chiave <math>K_t</math> per scambiarsi altre due chiavi, <math>K_{subA}</math> e <math>K_{subB}</math>, delle sottochiavi di cifratura. Le credenziali di Alice e Bob, in Kerberos, vengono derivate a partire dalle password degli utenti, attraverso una funzione MDC. È importante notare che, assieme alla password, viene usato anche il nome di dominio in cui opera il server: questo fatto fa sì che, se un utente usa la stessa password per più domini diversi, anche se il database di un dominio viene perso, gli altri domini non sono in pericolo. ==== Chiave calcolata da tutti i nodi ==== L'importanza di questo tipo di approccio è che tutti partecipano al calcolo della chiave. Per generare le chiavi su usano dei numeri casuali, mentre per evitare il problema dei ''replay attack'' si ricorre all'uso di ''nonce''. [[Immagine:sicurezza_chiavi_derivate.png]] Questo tipo di protocollo utilizza le credenziali di lungo periodo di Alice e di Bob per trasportare i numeri casuali con cui verrà calcolata la chiave, per esempio con un MDC: :<math>K_t = MDC(r_1,r_2)</math> ma questo fa sì che il protocollo non goda della PFS: se la sessione viene registrata e se vengono scoperte le chiavi private di Alice e di Bob, i numeri casuali <math>r_1</math> e <math>r_2</math> possono essere recuperati e, di conseguenza, può essere ricalcolata la chiave effimera con cui decifrare tutti i messaggi. Per aggiungere la PFS, si ricorre al protocollo ''Station To Station STS'', che è una variante dell'algoritmo Diffie-Hellman con autenticazione. [[Immagine:sicurezza_chiavi_derivate_STS.png]] In questo caso, Alice manda a Bob tutte le grandezza che sono necessarie all'algoritmo Diffie-Hellman; Bob risponde con gli altri valori necessari per il calcolo della chiave, ma aggiunge anche la versione cifrata (con la chiave temporanea) della sua firma sui due numero <math>g^{Sa}</math> e <math>g^{Sb}</math>, in modo tale da autenticarsi ad Alice. Come ultimo passo, anche Alice si autentica a Bob, mandando la versione cifrata della sua firma sui due numero <math>g^{Sa}</math> e <math>g^{Sb}</math>. Ovviamente, come prevede l'algoritmo Diffie-Hellman, la chiave temporanea sarà :<math>K_t = g^{Sa\cdot Sb}\mod{p}</math> Questo protocollo garantisce la PFS, perché questa volta davvero non circola nulla sulla rete che possa portare alla chiave temporanea. Lo scambio delle firme cifrate garantisce che sia Alice che Bob hanno calcolato la stessa <math>K_t</math>, e permette loro di autenticarsi. L'unico difetto di questo approccio è la complessità computazionale, dal momento che si usano sia Diffie-Hellman che chiavi asimmetriche. ==== Certification Authority ==== Le ''Certification Authority, CA'' rispondono alla necessità di autenticare le chiavi pubbliche: il concetto è simile al KDC, ma si opera nel mondo della crittografia asimmetrica. La CA si pone come un intermediario di fiducia tra Alice e Bob, che certifica l'autenticità d l'integrità delle loro chiavi pubbliche, in modo tale che essi siano in grado di riconoscersi senza ombra di dubbio. Un certificato digitale non è altro che una firma apposta sulla coppia <math>(K_{pubA}, A)</math>, :<math>Cert_A = S_{CA}(K_{pubA},A)</math> cioè, l'autorità certificante firma e si pone da garante per Bob, dichiarando che la chiave pubblica <math>K_{pubA}</math> è effettivamente associata ad Alice, cioè la particolare chiave è associata alla particolare persona (o azienda, o server). Perché tutto questo funzioni, è necessario che Bob possegga la vera chiave pubblica del CA; inoltre, l'autorità deve essere di fiducia (''trusted'') sia per Alice che per Bob: Alice si fida dell'autorità e paga per avere il certificato, Bob si fida della CA ed accetta la sua firma come prova dell'identità di Alice. L'autorità di certificazione può essere anche offline, non deve essere necessariamente collegata ad internet o consultabile perché il meccanismo funzioni: quando Bob possiede il certificato digitale e la chiave pubblica della CA (di cui ha la garanzia della veridicità), è in grado in qualsiasi momento di verificare la firma della CA, senza doverla interpellare. == Collegamenti esterni == * [[w:en:SecurID|Pagina della Wikipedia inglese su SecurID]] (in inglese) (7/12/2008 verificato funzionante) * [http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=30653 ISO/IEC 9798-2] (in inglese) (negozio di contenuti a pagamento) (7/12/2008 verificato funzionante) * [http://www.faqs.org/rfcs/rfc3163.html ISO/IEC 9798-3 - RFC 3163] (in inglese) (7/12/2008 verificato funzionante) * [http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=31488 ISO/IEC 9798-4] (in inglese) (negozio di contenuti a pagamento) (7/12/2008 verificato funzionante) * [http://tcpdump.org Sito di TcpDump] (in inglese) (7/12/2008 verificato funzionante) slruvxvp1r1ioaiptdj94na59q4hw6a 259477 259475 2022-07-19T14:08:03Z Eumolpo 11994 ortografia wikitext text/x-wiki Un protocollo crittografico è un algoritmo distribuito che viene eseguito da <math>n</math> soggetti, con <math>n \ge 2</math>, che indica quali azioni devono essere fatte per raggiungere un certo tipo di sicurezza. Il protocollo crittografico indica come usare un algoritmo crittografico, al fine di ottenere * autenticazione; * confidenzialità; * protezione dell'integrità dei dati; * ... == Autenticazione == L'autenticazione può essere orientata in due direzioni: * autenticazione dei messaggi; * autenticazione dei nodi. L'autenticazione dei messaggi consiste nell'avere una prova dell'origine da cui arrivano i messaggi ed una prova dell'integrità dei messaggi stessi. Questo risultato può essere raggiunto attraverso una funzione di [[w:Message authentication code|MAC]], che si occupa di fare da [[Funzioni di hash|MDC]], ma con una chiave: l'MDC verifica la correttezza del messaggio ricevuto, la chiave verifica la sorgente del messaggio. A questa autenticazione si può aggiungere anche la proprietà di non ripudio, per la quale sono nate le firme digitali. Una proprietà fondamentale di tutto questo è che non è necessario che l'autenticazione avvenga in ''real time'', può anche essere rimandata per un tempo indefinito. Al contrario, l'autenticazione dei nodi è quell'autenticazione che mira a far sì che un soggetto (un nodo) possa riconoscere un altro soggetto e verificarne l'identità. Nel primo caso, io verifico che il messaggio è giunto da una persona che possiede una chiave, nel secondo caso verifico che è effettivamente Bob la persona con cui io voglio comunicare. È fondamentale, in questo caso, che la verifica possa essere fatta in diretta. Noi ci occuperemo principalmente dell'autenticazione dei nodi, più che dei messaggi. L'autenticazione è quel processo che permette ad Alice di verificare che la persona con cui sta comunicando sia effettivamente Bob, e non Trudy: serve una qualche forma di prova che faccia capire ad Alice che Bob è veramente Bob. L'autenticazione può essere mutua oppure no, dipende dalle situazioni. Un caso di autenticazione mutua è quando io voglio vedere la mia posta elettronica: * il server si deve autenticare a me, dandomi una prova del fatto di essere veramente il server a cui io voglio collegarmi; * io devo dare al server una prova di chi sono io, tipicamente attraverso un nome utente ed una password. Un caso in cui non è necessaria autenticazione mutua, per esempio, è quando io voglio fruire di un contenuto come può essere un giornale on-line: devo essere sicuro che il giornale sia effettivamente quello che voglio leggere, mentre al server non interessa sapere chi sono io. Una proprietà importante della prova di autenticazione è la non trasferibilità: Alice non dovrebbe essere in grado di usare la prova fornita da Bob, cioè Alice non dovrebbe essere in grado di andare da Charlie e convincerlo di essere Bob. Lo stesso protocollo di autenticazione, infine, deve minimizzare la possibilità che qualcuno come Trudy possa impersonare qualcun altro. Questa proprietà deve rimanere valida anche quando * Trudy può leggere gli scambi di dati tra Alice e Bob che si stanno autenticando; * Trudy può fare un numero infinito di tentativi di autenticazione con Alice o con Bob, facendo finta di essere Bob o Alice; * Alice e Bob stanno eseguendo più di un'autenticazione contemporaneamente. == Classificazione dei protocolli di autenticazione == I protocolli di autenticazione si distinguono tra loro in base alle funzionalità che possono offrire, come per esempio l'autenticazione mutua piuttosto che l'autenticazione del percorso, eccetera. Un altro parametro importante è la complessità degli algoritmi che sono necessari per eseguire un'autenticazione, così come la quantità di dati che è necessario scambiarsi. Infine, i protocolli si differenziano tra quelli che hanno bisogno di una figura terza per l'autenticazione (un garante super-partes), oltre che per il tipo di credenziali che sono necessarie, la dimensione di queste credenziali, per come queste credenziali devono essere usate e gestite. == Dimostrazioni d'identità == Perché Alice possa riconoscere Bob, quest'ultimo deve dimostrare di sapere o possedere qualcosa. Per esempio, Bob deve conoscere un [[w:PIN|PIN]], una [[w:Password|password]], una chiave simmetrica oppure la versione privata di una coppia di chiavi asimmetriche. Nel caso invece di possesso, possiamo parlare di [[w:Smart-Card|smart card]], oppure di ''calcolatori crittografici'', degli oggetti che forniscono una password utilizzabile una sola volta. Infine, per l'autenticazione si può ricorrere anche a caratteristiche biometriche di Bob (se è una persona), quali per esempio * il timbro della voce; * l'impronta digitale; * il fondo dell'occhio; * la forma dell'orecchio; * le caratteristiche del viso; * ... Ci sono tre classi di protocolli di autenticazione: * basati su password; * basati su ''challenge-response''; * basati su una prova che non prevede alcuna conoscenza a priori, ''zero-knowledge proof''. === Autenticazione tramite password === I protocolli basati sull'utilizzo di una password sono estremamente comuni, dal momento che la password è una prova molto semplice da ricordare e da usare. I protocolli che si basano su password sono insicuri quando * la password non può essere cambiata, oppure non cambia con una frequenza sufficiente; * le password usate sono passibili di [[w:Attacco a dizionario|attacco a dizionario]], online o, peggio ancora, offline; * la password viene trasmessa o salvata in chiaro. ==== Password Authentication Protocol ==== Il PAP è un protocollo usato esclusivamente dal protocollo [[w:Point-to-Point Protocol|PPP]]; si presume che il canale di trasmissione sia sicuro (una linea telefonica telecom, per esempio, viene considerata come non-intercettabile). [[Immagine:sicurezza_PAP.png]] Alice manda al server di autenticazione AS (Bob) il suo nome utente e la sua password. Il server di autenticazione conosce * il nome utente di Alice; * una ''trasformazione'' <math>h</math> della password; * un numero casuale di bit, detto ''salt''. Quello che viene fatto dal server di autenticazione è andare a cercare, in una tabella, il nome utente di Alice. Se il nome utente viene trovato, si preleva il ''salt'' e lo si usa all'interno di una funzione di MDC <math>f(\cdot)</math>: :<math>h' = f(password|salt)</math> Alla fine, viene fatto un confronto tra il risultato della funzione e la trasformazione in memoria e, se i numeri sono uguali, l'autenticazione ha successo. Il ''salt'' è un numero casuale che ha lo scopo di rendere gli attacchi a dizionario più difficili, perché grazie al ''salt'', anche se due utenti hanno la stessa password, difficilmente avranno lo stesso ''salt'' e quindi la stessa trasformazione <math>h</math> della password. Il database viene conservato in questa forma per evitare che le password siano facilmente recuperabili dal disco del server nel caso di furto o manomissione. Questo protocollo di autenticazione soffre di diversi problemi: * attacco ''man-in-the-middle'' efficacissimo; * il canale è considerato sicuro, ma lo è davvero? * il server di autenticazione riceve nome utente e password in chiaro, quindi è in grado di fingersi Alice con un altro server: trasferibilità; * le password del database sono sensibili ad un attacco a dizionario. Quindi, concludendo, PAP non deve assolutamente essere usato, a meno che non venga usato per lo meno in un tunnel cifrato. ==== Challenge Handshake Authentication Protocol ==== Il CHAP è una variante del protocollo PAP, ed è usata in alcune implementazioni di PPP ed in Microsoft Windows. [[Immagine:sicurezza_CHAP.png]] Quello che accade con CHAP è che la funzione di trasformazione viene eseguita sia da Alice che dal server AS. Il server di autenticazione chiede ad Alice di usare, come ''salt'', un numero casuale <math>c</math>: sarà poi Alice a mandare al server la trasformazione <math>r</math>. Il server, a sua volta, usa <math>c</math> per calcolare la sua trasformazione <math>r'</math> e soltanto se i risultati delle due trasformazioni saranno uguali, allora l'autenticazione andrà a buon fine. L'implementazione standard di CHAP usa :<math>r=MD5(user|password|c)</math> Problemi di CHAP sono: * attacco a dizionario con <math>r</math> (cioè, l'AS non è in realtà chi dice di essere); * il database delle password deve essere salvato in chiaro; * se <math>c</math> non è un numero casuale, sono possibili i ''replay attack'', cioè Trudy può riutilizzare l'<math>r</math> registrato per autenticarsi a sua volta. Ancora una volta, CHAP non deve essere usato a meno che i dati non vengano fatti transitare su un tunnel cifrato. ==== One-time password ==== Questo protocollo è stato pubblicato nel 1981 ad opera di [[w:Leslie Lamport|Leslie Lamport]]. Funziona esattamente come il CHAP, soltanto che <math>c</math> non è più un numero casuale, ma diventa un numero progressivo <math>n</math>. [[Immagine:sicurezza_one-time_password.png]] Definiamo <math>f^n(\cdot)</math> come la funzione MDC eseguita per <math>n</math> volte: :<math>h^n = f^n(\cdot) = MCD(MDC(MDC( \cdots )))</math> <math>n</math> volte Definiamo <math>y</math> il numero residuo di volte in cui sarà possibile usare la password. Alice deve mandare al server di autenticazione il valore :<math>h^y = f^y(password)</math> A tutto questo, di solito viene aggiunto un numero di ''salt'' per non dover salvare in chiaro il database delle password. Con questo protocollo, la trasferibilità delle credenziali viene limitata ad una sola autenticazione: Trudy può far finta di essere il server e rubare le credenziali corrette, ma queste saranno valide una volta soltanto. Tutti i protocolli che abbiamo visto finora, inoltre, hanno un difetto sostanziale: non prevedono la possibilità di fare autenticazione mutua, una funzione molto spesso importante. ==== Encrypted Key Exchange ==== Il protocollo [[w:Encrypted Key Exchange|EKE]] si propone di estendere il protocollo [[Criptosistemi_asimmetrici#Il_protocollo_Diffie-Hellman|Diffie-Hellman]], introducendo l'autenticazione sulla chiave che si calcola. [[Immagine:sicurezza_EKE.png]] Alice manda a Bob un numero <math>A</math> che contiene la versione cifrata di <math>g^{Sa}\mod{p}</math>, dove la chiave di cifratura <math>w</math> è la trasformazione MDC di una password condivisa. :<math>A = E_w(g^{Sa}\mod{p})</math> Bob, che riceve il messaggio di Alice, sceglie a sua volta un numero <math>Sb</math> con cui calcolare la grandezza :<math>g^{Sb}\mod{p}</math> e sceglie anche un numero casuale <math>c_1</math>. Alice, grazie al messaggio di Bob, sarà in grado di calcolare la chiave effimera <math>K</math>, esattamente come Bob, con cui cifrare un altro messaggio di risposta che contiene il numero casuale scelto da Bob ed un altro numero casuale, scelto da Alice. Se Bob ha ricavato la chiave <math>K</math> corretta, sarà in grado di decifrare il messaggio e di cifrarne uno nuovo, contenente soltanto il numero che ha scelto Alice. In questa maniera, si è ottenuta autenticazione mutua ed il setup di chiavi effimere simmetriche, utilizzabili per cifrare i messaggi successivi. Questo algoritmo gode anche di resistenza ad attacchi ''off-line'', perché anche decifrando i messaggi scambiati da Alice e Bob, non si ottengono che numeri casuali ed effimeri, già dimenticati dai due soggetti. L'unico problema è che sia Alice che Bob devono possedere la password e, se Bob è un server di autenticazione, avrà nella sua memoria le password in chiaro di tutti i suoi utenti. === Autenticazione tramite ''challenge'' === Una ''challenge'' è un numero scelto da uno dei due soggetti partecipanti all'autenticazione. Questo numero deve essere firmato dall'altro soggetto, Alice, attraverso un MAC. Bob autentica Alice non tanto sulla challenge, ma sul valore del MAC calcolato, che non può essere corretto se la chiave usata è sbagliata. La principale innovazione di questo tipo di protocolli è che Alice non deve svelare a nessuno, almeno durante l'autenticazione, il suo segreto <math>s</math>. Il segreto di Alice può essere qualsiasi cosa: una password, per esempio, ma anche la versione privata di una coppia di chiavi asimmetriche, oppure una chiave simmetrica condivisa. ==== La challenge ==== La challenge è di primaria importanza; deve sempre essere fresca, non deve esser mai stata usata: se così non fosse, gli attacchi di tipo ''replay'' diventerebbero facilissimi. La challenge può essere: * una ''nonce'', cioè un numero casuale usato una sola volta; * un numero di sequenza, cioè un contatore che continua ad aumentare ad ogni ciclo di autenticazione; * un ''timestamp'', un'informazione sul tempo. Usare un numero di sequenza o il tempo permette di evitare che la challenge circoli nella rete e possa essere intercettata, però il protocollo diventa più difficile da implementare: * nel caso dei numeri di sequenza, questi devono essere uguali per Alice e Bob, il che non è banale (se Alice usa computer diversi?); * nel caso del tempo, il problema è che gli orologi di Alice e Bob devono essere sincronizzati, cosa se non altro costosa. ==== Il segreto <math>s</math> ==== Il segreto <math>s</math> è un numero, protetto attraverso meccanismi crittografici, che viene condiviso tra Alice e Bob. Questo numero può essere statico oppure il risultato di algoritmi di cifratura o di MAC. Il problema principale sta nella gestione di questi segreti, che deve essere fatta in maniera sicura: servono algoritmi per generare questi segreti ed algoritmi di cifratura per mantenere questi segreti davvero segreti. Purtroppo, la non trasferibilità è ancora un risultato lontano, anche con questi algoritmi. Una variante può essere quella di avere dei segreti che non vengono condivisi tra i soggetti che si vogliono autenticare, ma vengono condivisi con un soggetto terzo, un server di autenticazione <math>Z</math> che autentica sia Alice che Bob e dà loro la garanzia di essere veramente chi dicono di essere. [[Immagine:RSA SecurID SID800.jpg|thumbnail|right|400px|RSA SecurID SID800]] Per venire incontro al problema del segreto, RSA ha lanciato un prodotto commerciale discretamente utilizzato, chiamato [[w:SecurID|''SecurID'']]: si tratta di un calcolatore, delle dimensioni di una chiave, che mostra un numero variabile nel tempo. Questo numero è sincronizzato con il server, ed è la nostra chiave di cifratura, anch'essa, a questo punto, effimera. ==== ISO/IEC 9798-2/4 ==== Gli standard [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-2]] e [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-4]] indicano due metodi di autenticazione del tipo ''challenge-response'', cioè un'autenticazione in cui il server chiede all'utente di firmare qualcosa, una ''challenge''. Questi protocolli sono basati: * sul tempo <math>t</math>; * su numeri random o contatori. Nel caso di protocolli basati sul tempo <math>t</math>, basta che Alice mandi un messaggio a Bob con i dati corretti perché venga accettata l'autenticazione; si tratta di un protocollo molto semplice e che permette l'utilizzo ottimale della rete: un solo piccolo messaggio per ottenere ciò che si vuole. [[Immagine:sicurezza_autenticazione_tempo.png]] Alice manda in chiaro la sua login <math>A</math>, e manda le informazioni sul tempo e sull'identità di Bob, cifrate con una chiave condivisa <math>s</math>: :<math>R = E_S(t,B)</math> Quello che deve fare Bob è controllare se il nome utente è corretto, decifrare il messaggio e verificare che l'istante di tempo sia compreso in un intorno accettabile :<math>t-x < t' < t+x</math> Nel caso di protocolli basati su ''nonces'', cioè su numeri casuali validi una volta sola, la complessità del protocollo cresce, ma è possibile anche fare autenticazione mutua. [[Immagine:sicurezza_autenticazione_nonces.png]] Ad iniziare la comunicazione, questa volta, è Bob, che manda ad Alice un numero casuale <math>c_1</math> e la sua identità. Alice risponde a questo messaggio con un nuovo messaggio in cui inserisce * il suo nome utente * il numero <math>R_A=E_s(c_1,c_2,B)</math> dove <math>R_A</math> contiene la ''nonce'' scelta da Bob, una ''nonce'' scelta da Alice e l'identità di Bob, tutto cifrato con una chiave condivisa <math>s</math>. A questo punto, Bob manderà ad Alice un messaggio di risposta con un numero :<math>R_B = E_s(c_2,c_1,A)</math> in modo tale che Alice abbia la conferma che Bob ha ricevuto il suo messaggio e vuole davvero parlare con lei. In questa maniera, il protocollo permette mutua autenticazione e previene anche la possibilità di ''replay attacks'', gli attacchi fatti mandando ad un utente i messaggi di login corrette registrate in passato. === Autenticazione con algoritmi asimmetrici === Vogliamo fare un ulteriore passo in avanti nella sicurezza, andando ad utilizzare le chiavi di cifratura asimmetrica come segreto per l'autenticazione. In questa maniera, il segreto di Alice non deve più essere condiviso con nessuno, basta che Bob o il server di autenticazione abbiano la chiave pubblica di Alice. Un passo in più può essere quello di adottare i certificati digitali. Questi altro non sono che dei documenti in cui un ente terzo, una ''Certification Authority CA'', dichiara che la chiave pubblica di Alice è effettivamente associata alla persona Alice, con tutta una serie di informazioni sul suo conto. I principali problemi che ci sono, nell'utilizzo di questo tipo di credenziali, sono * l'autenticazione delle chiavi pubbliche (perché le ''Certification Authority'' fanno il loro lavoro, sì, ma a pagamento); * complessità computazionale elevata. Un esempio semplice di utilizzo delle chiavi asimmetriche. Alice manda la sua login al server di autenticazione Bob, il quale risponde mandando la sua identità, una challange cifrata con la chiave pubblica di Alice e l'MDC della stessa challange. [[Immagine:sicurezza_esempio_autenticazione_chiavi_asimmetriche_challange.png]] L'autenticazione andrà a buon fine solo se Alice sarà in grado di mandare la challange corretta al server di autenticazione, in una qualche maniera (in chiaro, oppure cifrata con la chiave pubblica del server). Per la sicurezza della coppia di chiavi, è sempre bene assicurarsi che le implementazioni di autenticazione siano aderenti agli standard di sicurezza come il [[Criptosistemi_asimmetrici#Public_Key_Cryptograpy_Standard|PKCS]]. ==== ISO/IEC 9798-3 ==== Lo standard [[Protocolli di autenticazione#Collegamenti esterni|ISO/IEC 9798-3]] definisce un protocollo di autenticazione basato sulla crittografia asimmetrica e sulle firme digitali. Può essere basato sul tempo oppure su ''nonce''. Nel caso in cui si voglia usare il tempo, si ha autenticazione singola e massima efficienza di banda, perché si manda un solo messaggio che contiene: * la login di Alice; * il tempo <math>t</math>; * il destinatario del messaggio, Bob; * la firma sul numero <math>(t,Bob)</math> [[Immagine:sicurezza_autenticazione_iso_iec_9798_3_timestamp.png]] Nel caso di autenticazione con ''nonce'', invece, si può ottenere autenticazione mutua. Si ha: [[Immagine:sicurezza_autenticazione_iso_iec_9798_3_nonce.png]] * Bob manda ad Alice un messaggio contenente la sua identità è la ''nonce'' che ha scelto lui, <math>c_1</math>; * Alice risponde mandando la sua identità, quella di Bob, la sua ''nonce'' <math>c_2</math> e la firma su <math>(c_1,c_2,B)</math>; * Bob chiude il protocollo mandando l'identità di Alice e la sua firma sulla grandezza <math>(c_2,c_1,A)</math>. il fatto che anche Alice possa scegliere la sua challenge è importante, perché impedisce che Alice debba firmare un numero casuale senza saperne il motivo: magari sta ponendo la sua firma sull'MD5 di un messaggio che non ha mai scritto, senza saperlo. === ''Zero-knowledge proof'' === L'idea che sta alla base di questo tipo di autenticazione è che Bob, dopo aver autenticato Alice, non avrà nessuna ulteriore informazione sul segreto di Alice. Alice non rivelerà a Bob nulla che lui non sapesse già su Alice. Per far questo, bisogna introdurre la nozione di ''autenticazione in probabilità'': ad ogni scambio di messaggi, Bob ha una sicurezza sempre crescente sulla vera identità di Alice; ovviamente, la probabilità deve approssimarsi al 100% velocemente. ==== Protocollo Fiat-Shamir ==== {{Matematica voce|Teorema||Calcolare la radice quadrata di un numero <math>\mod{n}</math> è tanto complesso quanto sarebbe fattorizzarlo.}} Si parte dal presupposto che Bob, attraverso un canale sicuro, abbia alcune informazioni su Alice: * la sua login; * un numero <math>n</math> grande; * un altro numero <math>v = s^2\mod{n}</math>, dove <math>1<s<n</math> è un numero casuale coprimo con <math>n</math>. [[Immagine:sicurezza_fiat_shamir.png]] Per l'autenticazione, Alice manda a Bob un numero <math>x_i</math> definito come: :<math>x_i = r_i^2 \mod{n}</math> dove <math>1<r<n</math> è un numero casuale e coprimo con <math>n</math>. Bob risponde a questo messaggio con un numero <math>e_i = rand(\{0,1\})</math>, da cui Alice ricava e spedisce il numero :<math>y_i = r_i \cdot s^{e_i}\mod{n}</math> L'identità viene confermata se: * con <math>e_i = 0</math>, il risultato è stato :<math>y_i^2 = x_i \mod{n}</math> * con <math>e_i = 1</math>, il risultato è stato :<math>y_i^2 = x_i \cdot v \mod{n}</math> Con questo tipo di protocollo, Trudy è in grado di ingannare Bob soltanto dopo aver registrato una sessione di login e soltanto sotto l'ipotesi che Bob richieda la stessa identica sequenza di valori<math>e_i</math>: di conseguenza, Bob non deve mai chiedere più volte la stessa sequenza, altrimenti c'è il rischio che Trudy possa fare un ''replay attack''. Se la sequenza di <math>e_i</math> cambia, allora Trudy avrà ogni volta il 50% di probabilità di indovinare il risultato corretto; di conseguenza, la probabilità che Trudy possa riuscire a fare login è <math>2^{-i}</math>. In genere, un numero di ripetizioni <math>i</math> considerato sufficiente è attorno alle 30, 40 volte, sia perché è difficile da registrare, sia perché si ha un numero di permutazioni della sequenza degli <math>e_i</math> sufficiente a impedire ''replay attack'', che avrebbero probabilità di successo 100%. == Classificazione degli attacchi == === Registrazione, ''sniffing'' === È un attacco di tipo passivo, il più semplice di tutti ed il più probabile: Trudy si inserisce della linea di comunicazione tra Alice e Bob e registra tutto quello che viene trasmesso. È il primo attacco che verrà fatto, sempre. Bisogna quindi porre particolare attenzione quando si decide di usare un protocollo semplice come il PAP, perché bisogna partire dal presupposto che questo attacco è sempre possibile (lo è nella realtà, sempre): il server di autenticazione ''AS'' può essere corrotto, l'intruso attiva un servizio come [[Protocolli di autenticazione#Collegamenti esterni|tcpdump]] e registra tutte le credenziali che arrivano al server, senza nemmeno doversi preoccupare di andarle a cercare nel database, senza doversi immettere in nessuna connessione cifrata. Come conseguenza di questo attacco, tutto quello che può fare Trudy è cercare di calcolare le credenziali di Alice e Bob, come le password o le chiavi private. Altrimenti, se Trudy diventa un attaccante attivo, può cercare di impostare un ''replay attack'', immettendo nella rete i pacchetti che ha registrato e cercando di far credere a Bob di parlare con Alice o viceversa. Per ovviare a questi problemi, bisognerebbe sempre inserire, all'interno del protocollo che si vuole creare, un legame tra le identità dei partecipanti ed il tempo, oppure usare delle ''challange'' casuali. È importante proteggere non solo se stessi, ma anche le credenziali di chi si dovrà poi collegare al nostro server. === Lettura del database === Un attacco solo poco più complicato dello ''sniffing'', perché è necessario avere accesso al calcolatore di Alice o di Bob; questo può essere fatto attraverso dei [[w:Malware|malware informatici]], oppure avendo accesso fisico, rubando o semplicemente consultando l'hard disk non solo di Alice, ma anche del server di autenticazione. Per questo, è fondamentale che le password e tutti i documenti come le chiavi private vengano cifrati, perché è l'unico modo per proteggerli da un attacco al database. === Falsa identità === Con questo tipo di attacco, Trudy è in grado di intercettare i messaggi tra Alice e Bob, ed ha il tempo per modificarli. Allora, Trudy chiederà ad Alice di fare le trasformazioni per conto suo. I protocolli che prevedono di firmare soltanto delle ''challange'' sono i più esposti a questo tipo di attacco. Nel caso di credenziali simmetriche, Trudy potrebbe voler derivare le credenziali di Alice o di Bob, quindi potrebbe sottoporre loro delle challange apposite, pensate per ridurre al minimo lo sforzo (attacco di tipo ''chosen text''). Se poi le credenziali sono asimmetriche, allora Trudy potrebbe cercare di derivare le chiavi private, oppure potrebbe sottoporre una challange che in realtà non è soltanto un semplice numero casuale: potrebbe essere il digest di un documento, al quale Alice appone la sua firma facendone il MAC. A questo punto, Trudy ha un documento firmato da Alice. Alcune regole per evitare problemi di questo tipo sono: * il protocollo deve prevedere un padding casuale scelto sia da Alice che da Bob: Alice non deve essere costretta a firmare tutto quello che le si chiede di firmare; * usare protocolli che mettono in gioco anche il fattore tempo; * usare sempre credenziali diverse per i diversi servizi: una chiave privata può essere usata sia per fare login su servizi che per firmare documenti, ma viene esposta a due rischi diversi. === Attacchi a specchio === Sono degli attacchi che prevedono l'inizializzazione di più sessioni in parallelo. Un esempio: [[Immagine:sicurezza_esempio_attacco_a_specchio_ok.png]] Il protocollo d'esempio prevede che Alice mandi a Bob una challange <math>c_1</math>, Bob firma la challange e chiede ad Alice di firmarne una a sua volta, <math>c_2</math>. Ma cosa succede se Iniziamo una seconda sessione? [[Immagine:sicurezza_esempio_attacco_a_specchio_fregato.png]] Trudy inizia una sessione esattamente come farebbe Alice: Bob firma <math>c_1</math> e chiede di firmare <math>c_2</math>. A questo punto, Trudy può iniziare una nuova sessione, chiedendo a Bob di firmare <math>c_2</math> al posto di <math>c_1</math>: è una richiesta legittima, Bob risponderà con la firma di <math>c_2</math> ed una nuova challange <math>c_3</math>. A questo punto, Trudy può portare a compimento la prima sessione di login, perché è entrata in possesso della firma corretta per <math>c_2</math>, senza conoscere la chiave <math>K</math>. Attacchi di questo tipo sono evitabili: * usando credenziali diverse nelle due direzioni, come la crittografia asimmetrica, oppure crittografia simmetrica ma con due chiavi per le due diverse direzioni (Alice cifra i messaggi per Bob con <math>k_1</math> e Bob risponde ad Alice con <math>k_2</math>); * imponendo che sia il server di autenticazione a fare la prima richiesta; * eliminando le simmetrie nei messaggi, per esempio usando imponendo di fare il MAC di entrambi i ''nonce'', anziché soltanto uno. === Attacco ad intermediario === Trudy può iniziare due autenticazioni, una con Alice ed una con Bob. Prendiamo un protocollo di esempio: [[Immagine:sicurezza_esempio_attacco_intermediario_ok.png]] Trudy può attaccare il protocollo in questa maniera: [[Immagine:sicurezza_esempio_attacco_intermediario_fregato.png]] cioè, chiedendo ad Alice di firmare, nuovamente, i dati al posto di Bob. Se questa cosa può sembrare strana, si consideri la possibilità che sia Alice che Bob siano due server che comunicano in automatico, entrambi potrebbero voler aprire una connessione verso l'altro. Questo attacco può essere evitato chiedendo di firmare sempre tutte le challange in successione, cioè imponendo, al posto di <math>MAC_k(c_2,c_4)</math>, che venga firmato <math>MAC_k(c_2,c_1)</math>. == Chiavi effimere ed autenticazione == Vogliamo derivare delle chiavi temporanee da usare per uno scambio di dati; queste chiavi temporanee devono essere ''autenticate esplicitamente'', cioè ci deve essere la sicurezza assoluta che soltanto i soggetti che fanno parte del gruppo di lavoro, e che si sono autenticati, le conoscano davvero. Genericamente, i soggetti possono essere anche più di due. L'autenticazione dei soggetti che hanno diritto a conoscere la chiave è strettamente legata all'autenticazione delle chiavi effimere che, generalmente, vengono derivate da tutti durante la fase di autenticazione. È quindi il protocollo di autenticazione dei soggetti a doversi occupare della derivazione delle chiavi effimere autenticate. Le chiavi effimere, o temporanee, sono l'opposto delle ''chiavi master'', o chiavi di lungo periodo. Se le chiavi effimere devono essere cambiate ad ogni autenticazione (o anche più spesso), le chiavi di lungo periodo sono quelle chiavi, tipicamente asimmetriche, che servono per autenticare i soggetti all'interno di una sessione cifrata. L'utilizzo delle chiavi di lungo periodo in maniera intensiva, oltre ad essere computazionalmente più oneroso, espone le chiavi stesse, perché aumenta la quantità di dati che possono essere analizzati, da cui si può potenzialmente ricavare la chiave privata; al contrario, usare chiavi effimere permette di usare algoritmi di cifratura simmetrici, quindi meno computazionalmente onerosi, e permette che le chiavi siano cambiate molto più spesso, limitando quindi la quantità di testo cifrato che è possibile analizzare. Inoltre, se viene scoperta una chiave temporanea, saranno disponibili all'attaccante soltanto una quantità di dati limitata, mentre se si usasse la chiave di lungo periodo, una volta scoperta, esporrebbe tutti i dati alla decifratura, fatto sgradevole. Un altro motivo per cui usare le chiavi effimere è che queste possono essere più di una, in sessioni diverse, anche contemporaneamente: Alice può parlare in segretezza con più persone, senza che ognuno di loro possa leggere i dati che Alice scambia con gli altri. === Perfect Forward Secrecy === La PFS è la ''sicurezza perfetta nel futuro'', cioè la garanzia che, una volta cancellate le chiavi effimere, anche se qualcuno scopre la chiave di lungo periodo, non ha alcuna informazione aggiuntiva sulle chiavi temporanee e, quindi, non potrà comunque leggere le informazioni protette con chiavi temporanee. Un esempio di algoritmo che offre PFS è [[Protocolli di autenticazione#Encrypted Key Exchange|EKE]], mentre qualsiasi protocollo che prevede di scambiarsi le chiavi cifrandole con la chiave master non offre alcuna garanzia di PFS, perché le chiavi saranno recuperabili dalla registrazione. Ovviamente, la PFS offre garanzie per il passato, ma non per il futuro: una volta che la chiave privata di Alice è stata compromessa, Trudy potrà comunque far credere agli altri di essere Alice. La ''forward secrecy'', invece, è quella proprietà del protocollo che, se una chiave effimera viene scoperta, nulla si sa su tutte le altre chiavi effimere. Infatti, anche se Trudy è in grado di calcolare una o più chiavi effimere, questo non la deve aiutare nel calcolo delle chiavi effimere successive o precedenti, né tantomeno per il calcolo della chiave privata di Alice o di Bob. Questa proprietà è molto importante, perché di solito le chiavi effimere sono meno protette delle chiavi di lungo periodo: * vengono condivise tra più persone; * non vengono salvate in forma cifrata; * sono usate per cifrare grandi quantità di dati, quindi sono più esposte alla crittanalisi. Di conseguenza, è più probabile che venga scoperta una chiave effimera piuttosto che la chiave di lungo periodo, quindi è importante che da questa non si riesca a risalire alla chiave di lungo periodo, né alle chiavi temporanee future o passate. === Setup delle chiavi effimere === Le chiavi effimere possono essere decise da un singolo soggetto, oppure essere calcolate in parallelo da tutti i partecipanti alla sessione protetta. Nel caso in cui la chiave venga decisa unilateralmente da un'entità, allora questa chiave dovrà essere cifrata con le credenziali di lungo periodo, in modo tale che gli utenti della sessione cifrata la possano ricevere in maniere sicura, senza che qualcuno possa leggerla. In questa manieral, la chiave temporanea viene protetta soltanto dalla chiave di lungo periodo. Nel caso, invece, in cui le chiavi vengano calcolate in parallelo da tutti i partecipanti alla sessione cifrata, allora tutti dovranno immettere il loro contributo affinché la chiave possa essere generata; questa chiave, quindi, non dovrà circolare nella rete, non dovrà essere protetta, quindi non ci sarà il pericolo che venga recuperata a partire dalle registrazioni di una sessione di comunicazione. Questo secondo approccio è più pesante del primo, dal punto di vista computazionale, ma offre la PFS ed è meno esposta a ''replay attack''. ==== Chiave trasportata nella rete ==== La chiave temporanea <math>K_t</math> può essere semplicemente decisa da Alice e poi comunicata a Bob in forma cifrata, usando la chiave master <math>K</math> per cifrare la chiave temporanea. Se, assieme alla chiave, cifriamo anche il nome del destinatario, allora si impedisce che quello stesso messaggio possa essere usato per fare un ''replay attack'' contro Alice; questo attacco resta comunque possibile nei confronti di Bob, oltre al fatto che manca totalmente la PFS. [[Immagine:sicurezza_chiave_trasportata.png]] Per ovviare ai ''replay attack'', si può imporre che sia Bob a comunicare ad Alice un numero <math>n</math> ''nonce'', in modo da rendere univoco il messaggio cifrato. [[Immagine:sicurezza_chiave_trasportata_nonce.png]] Aggiungendo poi le firme digitali, si ha un'autenticazione ancora più forte del messaggio. ==== Key Distribution Center ==== La distribuzione delle chiavi effimere per <math>n</math> nodi prevede che ognuno di questi nodi conosca <math>(n-1)</math> chiavi pubbliche, una per ogni altro partecipante alla sessione cifrata. Questo fatto è un problema, al crescere di <math>n</math>. Per ovviare a questo problema nascono i ''Key Distribution Center KDC'', i centri per la distribuzione delle chiavi effimere. Grazie al KDC, ogni nodo della rete protetta deve conoscere soltanto le credenziali proprie e del KDC, mentre il KDC stesso si incarica di tener traccia delle credenziali di tutti i nodi della rete protetta. Questo fa sì che il KDC sia un elemento fondamentale della rete, deve essere un nodo di fiducia per tutti coloro che si attestano alla rete, perché è l'unico vero intermediario tra i nodi deputato all'autenticazione di ogni singolo nodo e alla comunicazione delle chiavi temporanee. Usare un KDC è sicuramente un vantaggio nelle reti di grandi dimensioni, dove la scalabilità è importante. Infatti, aggiungere un nodo ad una rete di 1000 computer è tanto semplice con un KDC tanto è difficile in una rete distribuita. Inoltre, se un singolo nodo viene compromesso, il KDC dovrà aggiornare soltanto le sue credenziali, mentre in una rete distribuita tutti devono essere informati della nuova chiave pubblica e del fatto che quella vecchia non deve più essere usata. Al contrario, il KDC diventa un nodo nevralgico per la sicurezza di tutta la rete: se questo viene a mancare o se questo è sottodimensionato, rischia di diventare un collo di bottiglia per tutta la rete. Un esempio di implementazione di un KDC è il [[w:Protocollo_Kerberos|protocollo Kerberos]]; analizziamo, in maniera semplificata, ''Kerberos v5''. [[Immagine:sicurezza_kerberos_v5.png]] Supponiamo che Alice voglia parlare con Bob: dovrà quindi mandare al KDC un messaggio che contenga il suo username, lo username di Bob, ed un numero <math>n</math> come ''nonce''. Il server KDC risponderà ad Alice con due ''ticket'', due biglietti che contengono le credenziali per lei e per Bob: sarà Alice a dover comunicare a Bob le sue credenziali per poter iniziare la connessione cifrata. Tutte le chiavi che vengono rilasciate dal server kerberos devono essere usate entro un certo tempo, definito tal numero <math>L</math>. Opzionalmente, Alice e Bob possono usare questa chiave <math>K_t</math> per scambiarsi altre due chiavi, <math>K_{subA}</math> e <math>K_{subB}</math>, delle sottochiavi di cifratura. Le credenziali di Alice e Bob, in Kerberos, vengono derivate a partire dalle password degli utenti, attraverso una funzione MDC. È importante notare che, assieme alla password, viene usato anche il nome di dominio in cui opera il server: questo fatto fa sì che, se un utente usa la stessa password per più domini diversi, anche se il database di un dominio viene perso, gli altri domini non sono in pericolo. ==== Chiave calcolata da tutti i nodi ==== L'importanza di questo tipo di approccio è che tutti partecipano al calcolo della chiave. Per generare le chiavi su usano dei numeri casuali, mentre per evitare il problema dei ''replay attack'' si ricorre all'uso di ''nonce''. [[Immagine:sicurezza_chiavi_derivate.png]] Questo tipo di protocollo utilizza le credenziali di lungo periodo di Alice e di Bob per trasportare i numeri casuali con cui verrà calcolata la chiave, per esempio con un MDC: :<math>K_t = MDC(r_1,r_2)</math> ma questo fa sì che il protocollo non goda della PFS: se la sessione viene registrata e se vengono scoperte le chiavi private di Alice e di Bob, i numeri casuali <math>r_1</math> e <math>r_2</math> possono essere recuperati e, di conseguenza, può essere ricalcolata la chiave effimera con cui decifrare tutti i messaggi. Per aggiungere la PFS, si ricorre al protocollo ''Station To Station STS'', che è una variante dell'algoritmo Diffie-Hellman con autenticazione. [[Immagine:sicurezza_chiavi_derivate_STS.png]] In questo caso, Alice manda a Bob tutte le grandezza che sono necessarie all'algoritmo Diffie-Hellman; Bob risponde con gli altri valori necessari per il calcolo della chiave, ma aggiunge anche la versione cifrata (con la chiave temporanea) della sua firma sui due numero <math>g^{Sa}</math> e <math>g^{Sb}</math>, in modo tale da autenticarsi ad Alice. Come ultimo passo, anche Alice si autentica a Bob, mandando la versione cifrata della sua firma sui due numero <math>g^{Sa}</math> e <math>g^{Sb}</math>. Ovviamente, come prevede l'algoritmo Diffie-Hellman, la chiave temporanea sarà :<math>K_t = g^{Sa\cdot Sb}\mod{p}</math> Questo protocollo garantisce la PFS, perché questa volta davvero non circola nulla sulla rete che possa portare alla chiave temporanea. Lo scambio delle firme cifrate garantisce che sia Alice che Bob hanno calcolato la stessa <math>K_t</math>, e permette loro di autenticarsi. L'unico difetto di questo approccio è la complessità computazionale, dal momento che si usano sia Diffie-Hellman che chiavi asimmetriche. ==== Certification Authority ==== Le ''Certification Authority, CA'' rispondono alla necessità di autenticare le chiavi pubbliche: il concetto è simile al KDC, ma si opera nel mondo della crittografia asimmetrica. La CA si pone come un intermediario di fiducia tra Alice e Bob, che certifica l'autenticità d l'integrità delle loro chiavi pubbliche, in modo tale che essi siano in grado di riconoscersi senza ombra di dubbio. Un certificato digitale non è altro che una firma apposta sulla coppia <math>(K_{pubA}, A)</math>, :<math>Cert_A = S_{CA}(K_{pubA},A)</math> cioè, l'autorità certificante firma e si pone da garante per Bob, dichiarando che la chiave pubblica <math>K_{pubA}</math> è effettivamente associata ad Alice, cioè la particolare chiave è associata alla particolare persona (o azienda, o server). Perché tutto questo funzioni, è necessario che Bob possegga la vera chiave pubblica del CA; inoltre, l'autorità deve essere di fiducia (''trusted'') sia per Alice che per Bob: Alice si fida dell'autorità e paga per avere il certificato, Bob si fida della CA ed accetta la sua firma come prova dell'identità di Alice. L'autorità di certificazione può essere anche offline, non deve essere necessariamente collegata ad internet o consultabile perché il meccanismo funzioni: quando Bob possiede il certificato digitale e la chiave pubblica della CA (di cui ha la garanzia della veridicità), è in grado in qualsiasi momento di verificare la firma della CA, senza doverla interpellare. == Collegamenti esterni == * [[w:en:SecurID|Pagina della Wikipedia inglese su SecurID]] (in inglese) (7/12/2008 verificato funzionante) * [http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=30653 ISO/IEC 9798-2] (in inglese) (negozio di contenuti a pagamento) (7/12/2008 verificato funzionante) * [http://www.faqs.org/rfcs/rfc3163.html ISO/IEC 9798-3 - RFC 3163] (in inglese) (7/12/2008 verificato funzionante) * [http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=31488 ISO/IEC 9798-4] (in inglese) (negozio di contenuti a pagamento) (7/12/2008 verificato funzionante) * [http://tcpdump.org Sito di TcpDump] (in inglese) (7/12/2008 verificato funzionante) q6rkzy22h4hmqx13wduf2o6y0afl3vd I verbi particolari latini (superiori) 0 17720 259476 258424 2022-07-19T13:58:26Z 2.39.12.187 wikitext text/x-wiki {{risorsa|tipo=lezione|materia1=Grammatica latina per le superiori 1|avanzamento=100%}} == I Verbi Anomali == "Anomalo" è un Aggettivo dall'etimologia greca (''an'' = senza, ''homalòs'' = eguale) e significa "diseguale, differente", "senza regola". I grammatici definiscono '''anomali''' quei Verbi che: * Presentano temi differenti provenienti da Radici diverse. (Ad Esempio: ''Fero'', "Portare", il Tema del Presente ''Fer'' è ben diverso da quello del Perfetto ''Tul''). * Spesso sono senza Vocale Tematica che caratterizza l'appartenenza ad una Coniugazione. (Ad Esempio: L'Imperativo Presente Seconda Persona Plurale di ''Fero'' è ''Ferte'' senza la vocale '''ĭ''' - mentre ''lego'' ha ''lèg'''ĭ'''te''). * Hanno forme non regolari in alcuni Tempi e Modi derivanti dal Tema del Presente. Essi non sono molti ma sono abbastanza frequenti (anche nelle loro forme composte). Eccone l'elenco: * ''Sum, es, fui, esse'' / "Essere". * ''Fio, fis, factus sum, fieri'' / "Diventare". * ''Fero, fers, tuli, latum, ferre'' / "Portare". * ''Eo, is, ivi, itum, ire'' / "Andare". * ''Volo, vis, volui, velle'' / "Volere". * ''Edo, edis, edere'' / "Mangiare". * ''Queo, quivi, quire'' / "Potere". * ''Nequeo, nequīvi, nequīre'' / "Non potere". === Sum, es, fui, esse (Essere) === Il verbo essere in latino ha una funzione importantissima, ma una coniugazione altamente irregolare. È un verbo intransitivo quindi non ha forma passiva. L'irregolarità principale di ''sum'' sta nel tema del presente (''es''), che diventa ''s'' davanti a ''i'' o ''u'', ''er'' prima di una vocale (rotacismo). {| class="wikitable" |- |'''Indicativo presente''' ||s-um||e-s||e-st||su-mus||es-tis||s-unt |- |'''Indicativo imperfetto''' ||er-am||er-as||er-at||er-amus||er-atis||er-ant |- |'''Indicativo futuro semplice''' ||er-o||er-is||er-it||er-imus||er-itis||er-unt |- |'''Indicativo perfetto''' ||fu-i||fu-isti||fu-it||fu-imus||fu-istis||fu-erunt |- |'''Indicativo piuccheperfetto''' ||fu-eram||fu-eras||fu-erat||fu-eramus||fu-eratis||fu-erant |- |'''Indicativo futuro anteriore'''||fu-ero||fu-eris||fu-erit||fu-erimus||fu-eritis||fu-erint |- |'''Congiuntivo presente''' ||s-im||s-is||s-it||s-imus||s-itis||s-int |- |'''Congiuntivo imperfetto''' ||es-sem||es-ses||es-set||es-semus||es-setis||es-sent |- |'''Congiuntivo perfetto''' ||fu-erim||fu-eris||fu-erit||fu-erimus||fu-eritis||fu-erint |- |'''Congiuntivo piuccheperfetto'''||fu-issem||fu-isses||fu-isset||fu-issemus||fu-issetis||fu-issent |- |'''Imperativo presente''' || ||es|| || ||es-te|| |- |'''Imperativo futuro''' || ||es-to||es-to|| ||es-tote||s-unto |} Si trovano, nel congiuntivo presente, anche le forme ''siem'', ''sies'', ''siet''... e ''fuam'', ''fuas'', ''fuat''...; per l'imperfetto congiuntivo esiste anche ''forem'', ''fores'', ''foret''... Sono regolari le voci derivati dal tema del perfetto (''fu-'') Il verbo ''sum'' non ha supino, né gerundio, ha solo il participio futuro: ''futurus, -a, -um''; l'infinito presente è ''esse'', quello futuro ''futur-us, -a, -um, -i, -ae, -a esse'' oppure l'invariabile ''fore'', quello perfetto fa regolarmente ''fu-isse'' Come ''sum'' si coniugano i composti, ma * ''absum'' e ''praesum'' hanno i participi presenti ''absens'' e ''praesens'' * ''prosum'', che è formato da ''prod'' e ''sum'' mantiene la ''d'' prima delle vocali nei tempi derivati dal presente (''proderam'') ma la perde davanti a consonanti (''prosunt'') * ''possum'' (''pot + sum'') mantiene la ''t'' nei tempi derivati dal presente davanti a vocale (''potes''), ma la trasforma in ''s'' davanti a consonante (''possunt''). Manca dell'imperativo e ha il participio presente ''potens'' utilizzato però solo come aggettivo. ==== I Composti di Sum ==== Il Verbo ''Sum'' ha diversi composti di cui alcuni molto frequenti. Eccone l'elenco (il Prefisso è in grassetto): * '''''Ab'''sum, abes, '''ab'''fui / '''a'''fui, abesse'' / "Essere assente, Distare". * '''''Ad'''sum, ades, '''ad'''fui, adesse'' / "Essere presente, Vicino". * '''''De'''sum, dees, defui, deesse'' / "Mancare, Venir meno". * '''''In'''sum, ines, fui '''in''', inesse'' / "Essere dentro". * '''''Inter'''sum, intěres, interfui, interesse'' / "Essere in mezzo, Partecipare". * '''''Ob'''sum, obes, obfui, obesse'' / "Opporsi, Nuocere". * '''''Pos'''sum, '''pot'''es, '''pot'''ui, posse'' / "Potere, Essere in grado di". * '''''Prae'''sum, praees, praefui, praeesse'' / "Essere a capo, Comandare". * '''''Pro'''sum, '''prod'''es, profui, prodesse'' / "Giovare, Essere conveniente". * '''''Sub'''sum, subes, fui '''sub''', subesse'' / "Essere sotto, Sottostare". * '''''Super'''sum, supěres, superfui, superesse'' / "Essere superstite, Rimanere". <small>Di ''absum'' e ''praesum'' si usano i Participi Presenti con valore di Aggettivi: ''Absens'', ''Absentis'', "Assente", e ''Praesens'', ''Praesentis'', "Presente".</small> === Fio, fis, factus sum, fieri (Essere fatto, Diventare, Accadere) === Questo verbo significa ''divenire'', ''accadere'' (solo nelle terze persone) e viene usato come passivo di ''facio'' (''fare''). È un verbo semideponente, perché ha le voci derivate dal presente attive e quelle dal tema del perfetto passive. {| class="wikitable" |- |'''Indicativo presente'''||fi-o||fi-s||fi-t||fi-mus||fi-tis||fi-unt |- |'''Indicativo imperfetto'''||fi-ebam||fi-ebas||fi-ebat||fi-ebamus ||fi-ebatis ||fi-ebant |- |'''Indicativo perfetto'''||factus, -a, -um (sum, es, est)||facti, -ae, -a (sumus, estis, sunt) |- |'''Indicativo futuro'''||fi-am||fi-es||fi-et||fi-emus ||fi-etis||fi-ent |- |'''Congiuntivo presente'''||fi-am||fi-as||fi-at||fi-amus||fi-atis||fi-ant |- |'''Congiuntivo imperfetto'''||fie-rem||fie-res||fie-ret||fie-remus||fie-retis||fie-rent |- |'''Imperativo presente'''|| ||fi|| ||fi-te || || |- |'''Imperativo futuro'''||fi-to ||fi-to|| ||fi-tote || || |- |'''Infinito presente'''||fieri|| |- Tutte le voci derivanti dal perfetto si coniugano nello stesso modo, tranne che per il tempo del verbo essere. Si avrà infatti: eram,eras,erat / eramus,eratis,erant (Indicativo Piucheperfetto) ero,eris,erit / erimus,eritis,erunt (Indicativo Futuro Anteriore) sim,sis,sit / simus,sitis,sint (Congiuntivo Perfetto) essem,esses,esset / essemus,essetis,essent (Congiuntivo Piucheperfetto) Il participio perfetto è ''factus, -a, -um'', manca quello presente, ''futurus,-a,-um'' il participio futuro, che è preso in prestito dal verbo sum. L'infinito presente è ''fiěri'', quello perfetto ''factus esse'' e quello futuro ''factum iri''. Manca il gerundio, il gerundivo è ''faciendus, -a, -um''. ==== I Composti di Facio ==== Anche ''facio'' presenta vari verbi composti o con un prefisso (avverbio o preposizione o elemento nominale) e dal verbo stesso. Talvolta questi composti presentano il Tema Verbale con una apofonia della Vocale del Tema (''fac-'' diviene ''fic-'', ''fact-'' diviene ''fect-''). Al Passivo questi composti si comportano in due modi diversi: * Utilizzano ''fio'' se nella Forma Attiva conservano il Tema ''fac-'' / ''fact-'', cioè che conservano la a radicale. (Ad Esempio: ''Benefacio'', "Fare del bene" CHE AL PASSIVO FA ''Benefio, benefis, benefactus sum, benefieri''). * Se all'Attivo hanno il Tema ''fic-'', che deriva dalla trasformazione della ''a'' Radicale di ''facio'' in ''i'' per Apofonia, si comportano come i Passivi dei Verbi in ''-io''. (Ad Esempio: ''Affĭcio'', "Influire" CHE AL PASSIVO FA ''Affǐcio, eris, affectus sum, affĭcio''. === Fero, fers, tuli, latum, ferre (Portare) === Questo verbo (''portare'') ha un'enorme diversità tra i temi (''fer'' per il presente, ''tul'' per il perfetto e ''lat'' per il supino) e manca della vocale tematica, anche se a volte aggiunge una ''i''. All'imperativo non ha desinenza, o meglio, ha desinenza zero. {| class="wikitable" |- |'''Indicativo presente attivo'''||fer-o||fer-s||fer-t||fer-i-mus||fer-tis||fer-unt |- |'''Indicativo presente passivo'''||fer-or||fer-ris||fer-tur||fer-i-mur||fer-i-mini||fer-untur |- |'''Indicativo imperfetto attivo'''||fer-ebam||fer-ebas||fer-ebat||fer-ebamus||fer-ebatis||fer-ebant |- |'''Indicativo imperfetto passivo'''||fer-ebar||fer-ebaris||fer-ebatur||fer-ebamur||fer-ebamini||fer-ebantur |- |'''Indicativo futuro attivo'''||fer-am||fer-es||fer-et||fer-emus||fer-etis||fer-ent |- |'''Indicativo futuro passivo'''||fer-ar||fer-eris||fer-etur||fer-emur||fer-emini||fer-entur |- |'''Congiuntivo presente attivo'''||fer-am||fer-as||fer-at||fer-amus||fer-atis||fer-ant |- |'''Congiuntivo presente passivo'''||fer-ar||fer-aris||fer-atur||fer-amur||fer-amini||fer-antur |- |'''Congiuntivo imperfetto attivo'''||fer-rem||fer-res||fer-ret||fer-remus||fer-retis||fer-rent |- |'''Congiuntivo imperfetto passivo'''||fer-rer||fer-reris||fer-retur||fer-remur||fer-remini||fer-rentur |- |'''Imperativo presente attivo'''|| ||fer|| || ||fer-te|| |- |'''Imperativo futuro'''|| ||fer-to||fer-to|| ||fer-tote||fer-unto |} Tutto il resto è regolare; non esiste imperativo passivo, l'infinito presente è ''ferre'' (passivo ''ferri''). Per participio presente, gerundio e gerundivo ''fero'' si comporta come un verbo della seconda coniugazione. Sul modello di ''fero'' si coniugano i suoi composti, ma il perfetto e il supino di ''suffero'' (avendo ceduto questi due modi a ''tollo,is,substuli,sublatum,tollere'' che li ha perduti per ''fero'') sono, rispettivamente, ''sustinui'' e ''sustentum''. ==== I Composti di Fero ==== Anche ''Fero'' presenta molti Verbi Composti formati dall'unione del Verbo con le Principali Preposizioni Latine e con dei Prefissi (''Des''). Nell'unione spesso si verifica il Fenomeno Fonetico dell'Assimilazione che riguarda le consonanti. (Ad Esempio: Si può avere una Assimilazione Completa quale ''ad'' + ''fero'' che fa ''affěro'' in quanto la '''d''' di ''a'''''d''' si Assimila, diviene simile alla '''f''' di '''''f'''ero''. C'è anche una Assimilazione Parziale quale ''cum'' + ''fero'' divenendo ''confěro'' in quanto la '''m''' di ''cu'''m''''' diviene '''n''' davanti alla '''f''' di '''''f'''ero''. Eccone l'elenco: * (+ '''Ab''') / ''Aufero, aufers, abstǔli, ablātum, auferre'' / "Portar via, Togliere". * (+ '''Ad''') / ''Affero, affers, attǔli, allātum, afferre'' / "Portare, Arrecare". * (+ '''Ante''') / ''Antefera, antefers, antetǔli, antelātum, anteferre'' / "Portare innanzi, Anteporre". * (+ '''Circum''') / ''Circumfero, circumfers, circumtǔli, circumlātum, circumferre'' / "Portare intorno, Diffondere". * (+ '''Cum''') / ''Confero, confers, contǔli, collātum, conferre'' / "Radunare, Trasportare". * (+ '''De''') / ''Defero, defers, detǔli, delātum, deferre'' / "Portare giù, Riferire". * (+ '''Dis''') / ''Differo, differs, distǔli, dilātum, differre'' / "Portar qua e là, Differire". * (+ '''Ex''') / ''Effero, effers, exstǔli, elātum, efferre'' / "Portar fuori, Elevare". * (+ '''In''') / ''Infero, infers, intǔli, illātum, inferre'' / "Portar dentro, Introdurre". * (+ '''Ob''') / ''Offero, offers, obtǔli, oblātum, offerre'' / "Offrire, Contrapporre". * (+ '''Per''') / ''Perfero, perfers, pertǔli, perlātum, perferre'' / "Recare, Sopportare". * (+ '''Prae''') / ''Praefero, praefers, praetǔli, praelātum, praeferre'' / "Portare innanzi, Preferire". * (+ '''Pro''') / ''Profero, profers, protǔli, prolātum, proferre'' / "Tirare fuori, Proferire". * (+ '''Re''') / ''Refero, refers, rettǔli, relātum, referre'' / "Portare indietro, Riferire". * (+ '''Sub''') / ''Suffero, suffers, sustinǔi, sustentum, sufferre'' / "Sostenere, Sopportare". * (+ '''Trans''') / ''Transfero, transfers, transtǔli, translātum, transferre'' / "Trasportare". <sub>Il Prefetto ed il Supino (''Sustǔli'', ''Sublātum'') sono impiegati per il Paradigma del Verbo ''Tollo'' (''Tollo, is, sustǔli, sublātum, tollěre); ''Sustinǔi'' e ''Sustentum'' sono presi dal Verbo Sinonimo ''Sustineo''.</sub> === Eo, is, ivi / ii, ire (Andare) === Questo verbo significa ''andare'' ed è intransitivo, ma ha forma passiva solo per la terza persona singolare e per le forme verbali nominali. Nelle voci derivate dal presente ha radice ''e'' davanti a vocale, ''i'' prima di consonante; A differenza di ''fero'' e ''volo'', ''eo'' ha il futuro in ''-bo''. {| class="wikitable" |- |'''Indicativo presente'''||e-o||i-s||i-t||i-mus||i-tis||e-unt |- |'''Indicativo imperfetto'''||i-bam||i-bas||i-bat||i-bamus ||i-batis ||i-bant |- |'''Indicativo futuro'''||i-bo||i-bis||i-bit||i-bimus ||i-bitis||i-bunt |- |'''Congiuntivo presente'''||e-am||e-as||e-at||e-amus||e-atis||e-ant |- |'''Congiuntivo imperfetto'''||i-rem||i-res||i-ret||i-remus||i-retis||i-rent |- |'''Imperativo presente'''|| ||i|| || || i-te || |- |'''Imperativo futuro'''|| ||i-to||i-to || ||i-tote ||e-unto |} Le forme passive sono le seguenti (equivalgono alle forme italiane ''si va'' e simili); nei tempi composti data l'assenza del participio perfetto, sono formate dal supino seguito dal verbo essere. {| class="wikitable" |- |'''Indicativo presente'''||i-tur |- |'''Indicativo imperfetto'''||i-batur |- |'''Indicativo futuro'''||i-bitur |- |'''Indicativo perfetto'''||itum est |- |'''Indicativo piuccheperfetto'''||itum erat |- |'''Indicativo futuro anteriore'''||itum erit |- |'''Congiuntivo presente'''||e-atur |- |'''Congiuntivo imperfetto'''||i-retur |- |'''Congiuntivo perfetto'''||itum sit |- |'''Congiuntivo piuccheperfetto'''||itum esset |} Il tema del perfetto può essere indifferentemente ''i-'' e ''iv-'' e le desinenze sono regolari. L'infinito presente è ''ire'' (passivo ''iri''), quello perfetto e quello futuro regolari, ma quello futuro non ha il passivo. Il supino attivo è ''itum'', il passivo fa regolarmente ''itu''. Non c'è participio perfetto, il presente è ''iens'', ''euntis'', il futuro ''iturus'' (passivo ''eundem''). Il gerundio è ''eundi'' (genitivo), ''eundo'' (dativo), ''eundum'' (accusativo) e ''eundo'' (ablativo). ==== I Composti di Eo ==== Così come ''eo'', si coniugano allo stesso modo i suoi numerosi composti. Mentre, però ''eo'' è intransitivo, alcuni dei suoi composti sono transitivi per effetto della preposizione (ab, ad eccetera), e ammettono dunque il passivo in diverse forme. {{colonne}} #'''ab-eo''', -is, abii, abitum, abire, «andare via»; #'''ad-eo''', -is, adii, aditum, adire, «andare presso» e con significato transitivo, «incontrare»; #'''ante-eo''', -is, anteii, anteitum, anteire, «andare innanzi» e con significato transitivo, «superare»; #'''circum-eo''', -is, circumii, circumitum, circumire, «andare attorno» e con significato transitivo, «circondare»; #'''co-eo''', -is, coii, coitum, coire, «riunirsi» e con significato transitivo, «stringere» (un'alleanza); #'''ex-eo''', -is, exii, exitum, exire, «uscire»; #'''in-eo''',-is, inii, initum, inire, «entrare» e con significato transitivo, «intraprendere»; #'''inter-eo''', -is, interii, interitum, interire, «andare in rovina», «decadere»; #'''ob-eo''', -is, obii, obitum, obire, «andare verso» e con significato transitivo, «affrontare»; #'''per-eo''', -is, perii, perire, «perire», (''pereo'' viene utilizzato come passivo di ''perdo'', «mandare in rovina» ed è mancante di supino. Esiste però il participio futuro che è ''periturus''); {{colonne spezza}} <ol> <li value=11 >'''prae-eo''', -is, praeii, praeitum, praeire, «precedere»; <li>'''praeter-eo''', -is, praeterii, praeteritum, praeterire, «passare oltre» e con significato transitivo, «lasciare indietro»; <li>'''prod-eo''', -is, prodii, proditum, prodire, «avanzare»; <li>'''red-eo''', -is, redii, reditum, redire, «tornare»; <li>'''sub-eo''', -is, subii, subitum, subire, «andare sotto» e con significato transitivo, «subire»; <li>'''trans-eo''', -is, transii, transitum, transire, «passare oltre» e con significato transitivo, «attraversare»; <li>'''ven-eo''', -is, venii, venitum, venire, «essere venduto» (composto di venum+eo, «andare in vendita», è usato come passivo di ''vendo'', «dare in vendita», che ha soltanto le forme passive ''venditus'' e ''vendendus''). </ol> {{colonne fine}} Appartenente alla quarta coniugazione è '''ambio''', -is, ambii (o ambivi), ambitum, ambire, «andare intorno», anch'esso composto di ''eo'' (da amb+eo). Sono composti di ''eo'' anche: '''queo, quis, quivi, quitum, quire''', «potere», «essere in grado di», «capaci di» e '''nequeo, nequis, nequivi, nequitum, nequire''', «non potere», «non essere in grado di», «non capaci di». Entrambi i verbi sono mancanti in molte forme (part. futuro, imperativo, supino, gerundivo e gerundio); alcune forme sono arcaiche, altre rare, altre ancora poetiche. <div style="overflow:auto"> {{colonne}} {| class="wikitable" |- |'''Indicativo presente'''||queo||(quis)||quit||(quimus)||(quitis)||queunt |- |'''Indicativo imperfetto'''||(quibam)||(quibat)||(quibant)|| || || |- |'''Indicativo futuro'''||(quibo)||quibunt|| || || || |- |'''Perfetto'''||(quivi)||quivit (o quiit)||quiverunt|| || || |- |'''Futuro anteriore'''||quivero|| || || || || |- |'''Congiuntivo presente'''||queam||queas||queat||queamus||(queatis)||queant |- |'''Congiuntivo imperfetto'''||quirem||quiret||quirent|| || || |- |'''Congiuntivo perfetto'''||quiverit||(quiverint)|| || || || |- |'''Infinito'''||quire (al presente)|| quisse (al passato)|| || || || |- |'''Participio Presente'''||quiens||queuntis|| || || || |} {{colonne spezza}} {| class="wikitable" |- |'''Indicativo presente'''||nequeo||(nequis)||nequit||(nequimus)||nequitis||nequeunt |- |'''Indicativo imperfetto'''||(nequibam)||nequibat||nequibant|| || || |- |'''Indicativo futuro'''||(nequibit)||(nequibunt)|| || || || |- |'''Perfetto'''||nequivi||nequivisti||nequivit||quiverunt|| || |- |'''Piuccheperfetto'''||nequiverat||nequiverant|| || || || |- |'''Congiuntivo presente'''||nequeam||nequeas||nequeat||nequeamus||nequeant|| |- |'''Congiuntivo imperfetto'''||nequirem||nequiret||nequirent|| || || |- |'''Infinito'''||nequire (al presente)|| nequivisse o nequisse (al passato)|| || || || |- |'''Participio Presente'''||nequiens||nequeuntis|| || || || |} {{colonne fine}} </div><small>'''Nota''': tra parentesi vengono messe le forme utilizzate solamente da autori del periodo post-classico. Come si può notare molte forme non vengono neanche inserite, alcune vengono usate su ''queo'', altre su ''nequeo''.</small> === Volo e i suoi Composti === I tre verbi ''volo'', ''nolo'' e ''malo'' significano ''volere'', ''non volere'' e ''preferire''. I loro paradigmi sono i seguenti: {| class="wikitable" |- |'''volo''' || vis || volui || velle |- |'''nolo''' || non vis || nolui || nolle |- |'''malo''' || mavis || malui || malle |} ; Volo Questo verbo presenta il tema in tre modi diversi: ''vol-'', ''vel-'' e ''vi-'' {| class="wikitable" |- |'''Indicativo presente'''||volo||vis||vult||volumus||vultis||volunt |- |'''Indicativo imperfetto'''||vol-ebam||vol-ebas||vol-ebat||vol-ebamus||vol-ebatis||vol-ebant |- |'''Indicativo futuro'''||vol-am||vol-es||vol-et||vol-emus||vol-etis||vol-ent |- |'''Congiuntivo presente'''||vel-im||vel-is||vel-it||vel-imus||vel-itis||vel-int |- |'''Congiuntivo imperfetto'''||vellem||velles||vellet||vellemus ||velletis ||vellent |} Mancano i tempi dal supino, l'imperativo; l'infinito presente è ''velle'', il participio presente ''volens'' ha solo valore di aggettivo. Regolari i tempi derivati dal perfetto. Accanto a ''vult'' e ''vultis'', arcaicamente, si trova ''volt'' e ''voltis''; le forme di cortesia ''si vis'' e ''si vultis'' (''se vuoi''/''se volete'') possono essere contratte in ''sis'' e ''sultis'' ; Nolo Il verbo è formato da ''non'' e ''volo'' (significa infatti ''non volere''), il ''non'' non si fonde nel verbo in alcune forme dell'indicativo presente. {| class="wikitable" |- |'''Indicativo presente'''||nolo||non vis||non vult||nolumus||non vultis||nolunt |- |'''Indicativo imperfetto'''||nol-ebam||nol-ebas||nol-ebat||nol-ebamus ||nol-ebatis ||nol-ebant |- |'''Indicativo futuro'''||nol-am||nol-es||nol-et||nol-emus ||nol-etis||nol-ent |- |'''Congiuntivo presente'''||nol-im||nol-is||nol-it||nol-imus||nol-itis||nol-int |- |'''Congiuntivo imperfetto'''||nollem||nolles||nollet||nollemus ||nolletis ||nollent |- |'''Imperativo presente'''|| ||noli|| || ||nolite || |- |'''Imperativo futuro'''|| ||nolito|| || || nolitote|| |} Mancano i tempi dal supino, l'imperativo futuro ha solo le seconde persone; l'infinito presente è ''nolle'', il participio presente ''nolens''. Regolari i tempi derivati dal perfetto. ; Malo Il verbo è formato da ''magis'' e ''volo'' (letteralmente ''volere di più'' e quindi ''preferire'') contratto prima in ''mavolo'' e poi ridottosi per similitudine a ''nolo'' in ''malo''. {| class="wikitable" |- |'''Indicativo presente'''||malo||mavis||mavult||malumus||mavultis||malunt |- |'''Indicativo imperfetto'''||mal-ebam||mal-ebas||mal-ebat||mal-ebamus||mal-ebatis||mal-ebant |- |'''Indicativo futuro'''||mal-am||mal-es||mal-et||mal-emus||mal-etis||mal-ent |- |'''Congiuntivo presente'''||mal-im||mal-is||mal-it||mal-imus||mal-itis||mal-int |- |'''Congiuntivo imperfetto'''||mallem||malles||mallet||mallemus ||malletis ||mallent |} Mancano i temi dal supino, niente imperativo, manca anche il participio presente (a differenza di ''volo'' e ''nolo)''; l'infinito presente è ''malle''. === Edo, edis, edi, esum, eděre (Mangiare) === Esso si coniuga come gli altri Verbi della Terza Coniugazione. Restano in uso però tra gli autori latini alcune forme derivanti dalla unione diretta della Radice ''ed-'' con alcune desinenze per esempio ''ed-'' + ''-sem'' = ''ěssem''; ''ed-'' + ''-s'' = ''es''. Infatti l'assenza della Vocale Tematica è una delle caratteristiche dei Verbi Anomali. Esse sono confondibili con quelle di ''sum'' le quali però sono di gran lunga più frequenti. Ecco le forme in cui ''Edo'' risente del fenomeno illustrato (tra parentesi è la forma regolare): {| class="wikitable" |- |'''Indicativo presente'''||'''ēs''' (''edis'')||'''ēst''' (''edit'')||'''estis''' (''edǐtis'') |- |'''Congiuntivo presente'''||'''edim''' (''edam'')||'''edis''' (''edas'')||'''edit''' (''edat'')||'''edimus''' (''edamus'')||'''editis''' (''edatis'')||'''edint''' (''edant'') |- |'''Congiuntivo imperfetto'''||'''essem''' (''eděrem'')||'''esses''' (''eděres'')||'''esset''' (''eděret'')||'''essemus''' (''eděremus'')||'''essetis''' (''eděretis'')||'''essent''' (''eděrent'') |- |'''Imperativo presente'''||'''es''' (''ede'')||'''este''' (''edĭte'') |- |'''Imperativo futuro'''||'''esto''' (''edĭto'')||'''esto''' (''edĭto'')||'''estote''' (''editote'')||- (''edunto'') |- |'''Infinito presente'''||'''esse''' (''eděre'') |} Il verbo '''edo''' presenta due forme composte che si comportano come il Verbo d'Origine: * '''''Comědo''', comědis, comēdi, comeděre'', "Divorare, Scialacquare". * '''''Exědo''', exědis, exēdi, exēsum, exeděre'', "Rodere, Corrodere, Rovinare". == I Verbi Difettivi == I Verbi Difettivi sono quelli che mancano di alcune forme nella loro Coniugazione. I motivi di questa mancanza sono i più svariati e per comprendere ogni caso occorre indagare nella storia della Lingua Latina. Essi sono molto numerosi. Molti verbi manvano di un Tema o di due Temi come per esempio ''pendeo, pendes, pependi, - pendēre'' (essere sospeso) che manca del Supino e ''disto, distas, -. -. distare'' (essere distante, distare) che manca del Perfetto e del Supino. Di seguito sono elencati i Verbi Difettivi che presentano molte mancanze nella loro Coniugazione: * ''Aio'', ''Inquam'', ''For'', "Dire". * ''Coepi'', "Cominciare". * ''Memini'', "Ricordare". * ''Novi'', "Sapere". * ''Odi'', "Odiare". * ''Age'', ''Cedo'', ''Quaeso'' (Espressioni di Richiesta). * ''Ave'', ''Salve'', ''Vale'' (Espressioni di Saluto). === Aio, ais (Dire, Affermare) === Lo si trova nei Discorsi Diretti, quando si introduce una citazione, e nelle Frasi Incidentali. È sinonimo di ''Dico''. Ecco le Forme più frequenti: {| class="wikitable" |- |'''Indicativo presente'''||aio||ais||ait||aiunt |- |'''Indicativo imperfetto'''||aiebam||aiebas||aiebat||aiebatis||aiebant |- |'''Indicativo perfetto'''||ait |- |'''Congiuntivo presente'''||aiat |- |'''Participio presente'''||aiens |} === Inquam, inquis, inquii (Dire) === Si usa nei Discorsi Diretti ed è Intercalato al Dialogo. Eccone le forme: {| class="wikitable" |- |'''Indicativo presente'''||inquam||inquis||inquit||inquĭmus||inquǐunt |- |'''Indicativo futuro'''||inquĭes||inquǐet |- |'''Indicativo imperfetto'''||inquiebat||inquiebant |- |'''Indicativo perfetto'''||inquii||inquīsti||inquit |- |'''Congiuntivo presente'''||inquĭat||inquǐant |} === For, faris, fatus sum, fari (Dire, Parlare "in modo solenne") === È usato nelle seguenti forme: {| class="wikitable" |- |'''Indicativo presente'''||for||faris||fatur||fantur |- |'''Indicativo futuro semplice'''||fabor||faberis |- |'''Indicativo perfetto'''||fatus est||fati sunt |- |'''Indicativo piuccheperfetto'''||fatus eram||eras||''etc.'' |- |'''Congiuntivo imperfetto'''||farer||farentur |- |'''Imperativo presente'''||fare |- |'''Infinito presente'''||fari |- |'''Participio presente'''||fans||fantis |- |'''Participio perfetto'''||fatus||a||um |- |'''Supino Passivo'''||fatu |- |'''Gerundio'''||fandi||fando||fandum||fando |- |'''Gerundivo'''||fandus||a||um |} Il verbo ''for'' ha diversi composti (''ad-for'', ''ef-for'', ''pro-for'', ...) usati nella lingua religiosa. ''For'' ha la Radice (Suono Consonantico '''f''' + vocale) in comune col verbo greco ''phemi'' (= dire). Da esso trova origine la parola italiana '''Profeta''' "Colui che parla al posto di Dio, Colui che pre-annunzia". Stessa etimologia hanno i vocaboli latini ''Fa-m-a'' (Fama, Diceria) e ''Fa-b-ula'' (Favola, Racconto, Conversazione). Con il Prefisso di Negazione '''in-''' ed il Participio Presente si forma la parola ''Infans, infantis'' (Colui che non parla ancora), da cui deriva il Sostantivo ''Infantia, ae'' (L'Età in cui non si parla ancora); sempre con Prefissi di Negazione e con il Gerundivo si creano due Aggettivi: ''Infandus'' (Che non si può dire, Indicibile) e ''Nefandus'' (Che non si deve pronunziare: quindi "empio"). === Coepi, coepisti, coepisse (Cominciare, Iniziare) === Esso è sempre seguito da un Infinito (è un Verbo quindi Fraseologico). Ha solo le Forme derivate dai Temi del Perfetto e del Supino. Per i Tempi derivanti dal Tema del Presente si usa un composto di ''Capio'': ''Incipio, incipis, incepi, inceptum, incipěre'' (Stesso significato e stessa costruzione). === Memǐni, meministi, meminisse (Ricordare) === La particolarità del verbo ''memini'' è che in quanto difettivo presenta soltanto la forma del Perfetto e dei Tempi Derivati i quali hanno però significato di Presente e Derivati. Quindi il Perfetto corrisponde al Presente, il Piuccheperfetto all'Imperfetto e il Futuro Anteriore al Futuro Semplice. Per capire questa situazione bisogna considerare che il perfertto indica una situazione svoltasi nel passato che produce ancora i suoi effetti nel presente (Ad Esempio: L'Azione Passata di "aver mandato a mente" (''Me-mini'' è un Perfetto con Raddoppiamento, come avviene nella Formazione del Perfetto Greco) si traduce nell'azione attuale di "ricordare". La radice '''Min-''' è la stessa di parole come ''Memoria'' (La Memoria), ''Mens, mentis'' (La Mente), ''Monĭtus'' (Annunzio, Ammonimento). ''Reminiscor'' e ''Recordor'' sono sinonimi di ''Memini'': Questi Verbi sono seguiti per lo più dal Genitivo della Persona o delal Cosa che si ricorda. L'Opposto di ''Memini'' è ''Obliviscor'' (Dimenticare). Il Verbo ''Memǐni'' ha la Forma dell'Imperativo Futuro benché non abbia il Tema del Presente. La Coniugazione è Regolare: {| class="wikitable" |- |'''Indicativo perfetto'''||memĭni||meministi||''etc.''||''(io ricordo)'' |- |'''Indicativo futuro anteriore'''||meminěro||''etc.''||''(io ricorderò)'' |- |'''Indicativo piccheperfetto'''||memineram||''etc.''||''(io ricordavo)'' |- |'''Congiuntivo perfetto'''||meminerim||''etc.''||''(che io ricordi)'' |- |'''Congiuntivo imperfetto'''||meminissem||''etc.''||''(che io ricordassi, io ricorderei) |- |'''Infinito perfetto'''||meminisse||''(ricordare)'' |- |'''Imperativo futuro'''||memento||mementote||''(ricorda!, ricordate!) |} === Novi, novisti, novisse (Sapere) === Questo Verbo è il Perfetto di ''Nosco, noscis, novi, notum, noscěre''. La Radice è '''no-''' che si ritrova anche in altri Verbi legati all'idea del sapere e del conoscere come ''Cog'''no'''sco'', ''Ag'''no'''sco'', etc.. ''Nosco'' significa "Imparare, Apprendere" (sottolinea il processo dell'apprendimento) mentre ''Novi'' vale "Sapere" in quanto nel Passato indica l'azione di "Aver conosciuto" e quindi il suo effetto nel Presente è quello di "Sapere". L'Aggettivo ''Notus'' (Noto) indica appunto ciò che si conosce; ''Nobilis'' indica ciò che è degno di essere conosciuto. La Coniugazione è Regolare. I Tempi del Perfetto hanno il valore dei Tempi corrispondenti del Presente (come per il Verbo ''Memĭni'') quindi: ''Novi'' = "So"; ''Noveram'' = "Sapevo"; ''Novero'' = "Saprò", etc.. === Odi, Odisti, Osurus, Odisse (Odiare) === Anche ''Odi'' fa parte dei Verbi Perfettivi. Se in Passato "ho conosciuto l'odio", allora nel Presente continuo a odiare, cioè "odio". La Coniugazione è Regolare. Bisogna segnalare che ha il Participio Futuro (''Osurus'') anche se il Verbo manca del Tema del Supino. Come per ''Memini'' e ''Novi'', il Perfertto ''Odi'' vale per il Presente (Io odio), etc.. II sing. ōdisti III sing. ōdit I plur. ōdímus II plur. ōdistis III plur. ōdērunt, ōdere PIUCHEPERFETTO I sing. ōdĕram II sing. ōdĕras III sing. ōdĕrat I plur. ōderāmus II plur. ōderātis III plur. ōdērant FUTURO ANTERIORE I sing. ōdĕro II sing. ōdĕris III sing. ōdĕrit I plur. ōderímus II plur. ōderítis III plur. ōdĕrint CONGIUNTIVO PRESENTE I sing. – II sing. – III sing. – I plur. – II plur. – III plur. – IMPERFETTO I sing. – II sing. – III sing. – I plur. – II plur. – III plur. – PERFETTO I sing. ōdĕrim II sing. ōdĕris III sing. ōdĕrit I plur. ōderímus II plur. ōderítis III plur. ōdĕrint PIUCHEPERFETTO I sing. ōdissem II sing. ōdisses III sing. ōdisset I plur. ōdissēmus II plur. ōdissētis III plur. ōdissent === Espressioni di Richiesta: Age, Cedo, Quaeso === ''Age'', ''Agĭte'' e ''Cedo'', ''Cette'' che significano "Orsù, Dài, Forza!", segnalano un'Esortazione. ''Quaeso'', ''Quaesǔmus'' significa "Per favore, Di grazia, Prego", Formula di Cortesia e di Interlocuzione. === Espressioni di Saluto: Ave, Salve, Vale === ''Ave'', ''avēte'', e ''Salve'', ''Salvēte'' sono Formule di Saluto: "Salve, Salute, Ciao". ''Vale'', ''Valēte'' sono Formule di Saluto anche Epistolari: "Arrivederci, Addio". I Romani non usavano la Terza Persona (il "lei") nell'Interlocuzione, ma usavano il "tu" oppure il "voi" come oggi l'Inglese e il Francese. ==== Formule Epistolari ==== In Ambito Epistolare, i Latini impiegavano alcune Formule Fisse sia in Apertura sia in Chiusura di Lettera. * La Formula Base di Apertura è ''Salutem dicit'', "Saluta", che può essere variamente abbreviata: ''Salutem'' / ''Salut.'' / ''S. D.'' / ''S.''. Ad esso faceva seguito una Formula Siglata ''S.V.B.E.E.Q.V.'' (''Si Vales Bene Est Ego Quoque Valeo'' = "Se Stai Bene È Bene, Anch'Io Sto Bene") oppure più breve ''S.V.B.E.V.'' (''Si Vales Bene Ego Valeo'' = "Se Stai Bene [È Bene], Io Sto Bene). * La Formula Base di Chiusura è ''Vale'', ''Valēte'', "Arrivederci, Addio", che può presentare delle Varianti. == I Verbi Impersonali == In Latino come in Italiano ci sono alcuni Verbi che indicano Fenomeni Atmosferici e sono usati Impersonalmente. In realtà tali Verbi hanno un Soggetto Logico quale le Condizioni Atmosferiche quali Piovere, Nevicare, etc. oppure l'intervento di un Divinità o del Caso che fa Piovere, Nevicare, etc.. (Ad Esempio: Giovere era il Dio dei Tuoni, dei Fulmini, dei Nembi). I Verbi più Comuni sono i seguenti (tra parentesi alcune forme del Perfetto): * (''Di-'')''Lucescěre'' (''Luxit'') ---> "Farsi giorno, Albeggiare". * ''Disserenare'' ---> "Rasserenarsi, Fare bel tempo". * ''Elucescěre'' ---> "Iniziare a Risplendere". * ''Fulgurare'' ---> "Lampeggiare, Mandare lampi". * ''Fulminare'' ---> "Fulminare, Mandare fulmini". * ''Gelare'' ---> "Gelare, Ghiacciare". * ''Grandinare'' ---> "Grandinare". * ''Ningěre'' (''Ninxit'') ---> "Nevicare". * ''Noctescěre'' ---> "Farsi notte, Annottare". * ''Pluěre'' (''Pluit'') ---> "Piovere". * ''Tonare'' (''Tonǔit'') ---> "Tuonare". * ''Vesperascěre'' (''Vesperavit'') ---> "Farsi sera". Talora questi Verbi sono anche usati in Modo Personale, cioè con il Soggetto: ''Sed horrifĭcis iuxta '''tonat Aetna''' ruinis.''. (Verg.). / "Ma là da rupi orrende '''tuona''' a tratti '''l'Etna'''.". (trad. di E. Cetrangolo). Altri Verbi appaiono Impersonali (per esempio quelli che indicano Situazioni o Stati d'Animo come ''Interest'', "Interessa"; ''Evenit'', "Accade"; ''Paenitet'', "Si pente"), ma in realtà hanno un Soggetto, cioè un Argomento cui sono collegati, anche se questo si presenta al Nominativo ma in altri casi, o è costituito da un'Intera Frase. '''Questi Casi sono studiati nella Sintassi dei Casi e pertanto SI RINVIA A TALE LEZIONE.''' Importante riguardo a questa questione è anche la questione della Costruzione Impersonale dei Verbi. In Italiano si usa per lo più il '''Si''' Impersonale: "Si dice, Si pensa". Il Francese usa '''On''': (''On dit'', ''On pense''); L'Inglese '''People''' (''People say'', ''People think''); lo Spagnolo '''Se''' (''Se dice'', ''Se piensa''). Il Latino non conosce l'uso di questa Particella e ricorre a Costruzioni Personali e Impersonali, sia Attive sia Passive. '''Queste Costruzioni sono studiate nel Nominativo e pertanto SI RINVIA A TALE LEZIONE.''' == I Verbi Composti e Derivati == Dal punto di vista della loro Formazione i Verbi si dividono in due categorie: * '''I Verbi Composti:''' Sono quelli formati da un Prefisso e da un Verbo. '''Essi si studiano più approfonditamente insieme ai Prefissi in Latino e pertanto SI RINVIA A TALE LEZIONE.''' Si possono menzionare qui casi già visti durante la Lezione come i Composti di ''Eo'', di ''Facio'', di ''Fero'', di ''Sum''. Unendo la Preposizione-Prefisso ''In'' a questi Quattro Verbi si ottengono Quattro Verbi Composti: ''Ineo'', ''Inficio'', ''Insum'' che hanno Significati Particolari rispetto ai Verbi d'Origine. * '''I Verbi Derivati:''' Sono quelli che si ottengono aggiungendo un Suffisso al Verbo d'Origine e grazie a questo Suffisso si sottolinea una Sfumatura Particolare del Significato del Verbo Base. '''Essi si studiano più approfonditamente insieme ai Suffissi in Latino e pertanto SI RINVIA A TALE LEZIONE.''' Un esempio è ''Albeo'' che significa "Essere bianco" se si aggiunge ad esso il suffisso ''-Sco'' si ottiene ''Albesco'' che significa "Iniziare ad esser bianco, Divenire chiaro". {{nav grammlat 1}} g6rzn1rg7ucbz9n91qjahmijrnz0m34 Tempo sul giro (scuola media) 0 32154 259479 224176 2022-07-20T08:27:59Z Eumolpo 11994 ortografia wikitext text/x-wiki {{risorsa|tipo=lezione|materia1=Informatica per la scuola media 1|avanzamento = 100%}} ==Tempo sul giro (cronometro per gioco) == <!--(scegliere una di queste voci: dialogo, piccola storia, cambio-sfondo, movimento, cambio sprite, suoni, disegno libero, disegno geometrico, quiz a domande,gioco--> Misurazione tempi attività di gioco: tempo sul giro == Versione di Scratch utilizzata == La versione di scratch usata in questo progetto è scratch 3.0 online. == Cosa richiede l'esercizio == Il gatto percorre un semplice percorso guidato manualmente con le frecce della tastiera il cronometro misura e registra il tempo sul giro. Rispetto al percorso disegnato non c'è nessuna interazione, cosa che ovviamente può/deve essere aggiunta in modo che il gatto sia costretto a girare nel percorso. Per mettere delle interazioni che ''costringano'' il gatto a stare nel percorso si può prendere ispirazione da questo tutorial [https://www.coderdojotrento.it/risorse/scratch-tutorial-16-car-racing/ Car racing] del [https://Coderdojotrento.it Coderdojo Trento] == Come funziona il cronometro == In questo progetto il tempo sul giro viene registrato facendo uso del ''timer'', di due variabili ''Tempo'' e ''InterruttoreCrono'' e di una lista ''Tempi''. Fare il remix di questo script modificandolo, semplificandolo, usando meno variabili, dovrebbe essere piuttosto semplice. Il tempo sul giro viene misurato usando il ''timer'' che si trova nelle sezione dei blocchi ''Sensing'' (azzurri). Il gatto, ''Sprite1'', ogni volta che passa sulla linea di Partenza/Arrivo tocca lo sprite ''Paddle'', una linea rossa verticale corta. Ogni volta che il gatto passa sulla linea, che i due sprite si toccano, la linea scompare per un secondo, in modo che l'istante in cui avviene il tocco sia unico. Al primo passaggio del gatto viene azzerato e avviato il ''timer'' e il cronometro che è spento, ''InterruttoreCrono'' vale 0, viene acceso, portando ''InterruttoreCrono'' al valore 1 dallo script che riceve il messaggio ''Partenza''. Nei successivi passaggi viene registrato il ''Tempo'' nella variabile tempo che assume il valore del ''timer'' al passaggio. Il ''timer'' viene azzerato e così riavviato. Il tempo registrato viene inserito nella lista ''Tempi''. Ovviamente questo comportamento è modificabile, ad esempio programmando degli script in modo che venga tenuto registrato solo il miglior tempo. == Sfondo == {| class="wikitable" |+ !Istruzioni !Immagini |- |Disegnamo una pista sullo sfondo |[[File:PistaTempoSulGiro.png|400px|PistaTempoSulGiro]] |} <br /> ==Gatto (veicolo)== Per prima cosa uno inseriamo lo script per guidare il gatto, ovviamente in un progetto che usi il cronometro il gatto può essere sostituito da una macchinina o da qualsiasi altro ''veicolo'' ed anche il modo in cui lo si guida può essere modificato, vedi ad esempio [[Guidare uno sprite con le frecce, makey makey (scuola media)|Guidare con le frecce]]. {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" |[[File:Кот_Скретч.svg|150px|Gatto di Scratch]] |style="vertical-align:top;" | [[File:GreenFlagDrivingCat.png|400px|GreenFlagDrivingCat]] | style="vertical-align:top;" | Guidare il gatto con le frecce, inizialmente il gatto si posiziona in prossimità della linea di Partenza/Arrivo in posizione (-40,-140) puntando in direzione destra (90). questo script di guida del gatto è quello suggerito a pagina 24 nel manuale [https://it.wikibooks.org/wiki/File:Diderot_2014_Guida_Studenti.pdf Programmo anch'io] |} ==Gatto script per il funzionamento del cronometro== {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" | [[File:Кот_Скретч.svg|150px|Gatto di Scratch]] | style="vertical-align:top;" | [[File:GreenFlagDeleteAllTempi.png|400px|GreenFlagDeleteAllTempi]] | style="vertical-align:top;" | Inizializzare la lista ''Tempi'': la lista viene azzerata. |} {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" | [[File:Кот_Скретч.svg|150px|Gatto di Scratch]] |style="vertical-align:top;" | [[File:GreenFlagInizializzazione.png|400px|GreenFlagInizializzazione]] | style="vertical-align:top;" | Inizializzazione del ''timer'' della variabile ''Tempo'' e dell'''InterruttoreCrono'', sial il ''timer'' che la viariabile ''InterruttoreCrono'' vengono portati a 0. |} {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" | [[File:Кот_Скретч.svg|150px|Gatto di Scratch]] |style="vertical-align:top;" | [[File:GreenFlagTouchingPaddleBroadcast.png|400px|GreenFlagTouchingPaddleBroadcast]] | style="vertical-align:top;" | Ogni volta che il gatto passa dalla linea di partenza, e tocca lo sprite ''Paddle'' invia i messaggi per: salvare il tempo fatto sul giro, azzerare il cronometro e cominciare a misurare il tempo del giro successivo. |} {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" | [[File:Кот_Скретч.svg|150px|Gatto di Scratch]] |style="vertical-align:top;" | [[File:WhenReceiveArrivo.png|400px|WhenReceiveArrivo]] | style="vertical-align:top;" | Alla ricezione del messaggio ''Arrivo'' deve essere inserito il tempo registrato nella lista ''Tempi'' ed '''InterruttoreCrono'' deve essere mantenuto sul valore 1 (acceso). |} {| class="wikitable" !Sprite !Istruzioni !Blocco codice1 |- | style="vertical-align:top;" | [[File:Кот_Скретч.svg|150px|Gatto di Scratch]] |style="vertical-align:top;" | [[File:WhenReceivePartenza.png|400px|WhenReceivePartenza]] | style="vertical-align:top;" | Al primo passaggio dalla linea di ''Partenza/Arrivo'' deve essere azzerato il ''timer'' e l'''InterruttoreCrono'' deve essere portato ad 1 (acceso). |} ==Linea della partenza/arrivo== {| class="wikitable" !Sprite !Blocchi codice !Istruzioni |- | style="vertical-align:top;" | [[File:LineaRossa.png|thumb|LineaRossa]] |style="vertical-align:top;" | [[File:GreenFlagTouchingCatHideShow.png|400px|GreenFlagTouchingCatHideShow]] | style="vertical-align:top;" | La linea della partenza ''Paddle'' deve nascondersi appena tocca il gatto, ''Sprite1'', in modo che sia ben definito l'istante in cui avviare il timer, dopo un secondo la linea può riapparire. Questo serve a fare si che che ci sia un solo tocco tra i due sprite, che altrimenti continuando a toccarsi manderebbero più di un messaggio. |} == Progetto funzionante == https://scratch.mit.edu/projects/340517367/ ==Note== <references/> == Bibliografia == * Guida all’uso di Scratch Versione Studenti; Alberto Barbero, Marco Marchisotti, Alberto Davì; Associazione Dschola, Iniziativa realizzata nell’ambito del progetto Diderot della Fondazione CRT, 2014 ==Collegamenti esterni== * [https://upload.wikimedia.org/wikibooks/it/4/4b/Diderot_2014_Guida_Studenti.pdf Guida all’uso di Scratch Versione Studenti] ftz8d226vldso6z0scdwyx4zxi1u0mu Wikiversità:GUS2Wiki 4 35656 259478 259469 2022-07-19T19:28:49Z Alexis Jazz 33840 Updating gadget usage statistics from [[Special:GadgetUsage]] ([[phab:T121049]]) wikitext text/x-wiki {{#ifexist:Project:GUS2Wiki/top|{{/top}}}} I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al 2022-07-17T05:11:14Z. Un massimo di {{PLURAL:5000|un risultato è disponibile|5000 risultati è disponibile}} in cache. {| class="sortable wikitable" ! Accessorio !! data-sort-type="number" | Numero di utenti !! data-sort-type="number" | Utenti attivi |- |Navpopup || 33 || 3 |- |nav-sandbox || 31 || 4 |- |Toolbar || 22 || 3 |- |RivelatoreRedirect || 19 || 3 |- |HotCat || 19 || 3 |- |Purge || 18 || 3 |- |RivelatoreDisambigua || 16 || 2 |- |Orologio || 16 || 2 |- |RcColor || 15 || 3 |- |WikEd || 15 || 1 |- |Spostamento || 14 || 3 |- |ScoredRevisions || 12 || 3 |- |WikidataInfo || 12 || 2 |- |lastedit || 11 || 3 |- |CatWatch || 10 || 1 |- |EDTitle || 9 || 2 |- |Since || 8 || 1 |- |section0 || 7 || 3 |- |NamespacePreload || 1 || 1 |- |gadget-ReferenceTooltips || 0 || 0 |- |gadget-Transclusione || 0 || 0 |} * [[Speciale:GadgetUsage]] * [[w:en:User:Alexis Jazz/GUS2Wiki|GUS2Wiki]] di81ukrikvqqjulz4e94eecvnmm9c4j