You are on page 1of 44

ABSTRACT

ABSTRACT
ÍNDEX

1. INTRODUCCIÓ 5
1.1 OBJECTIUS DEL TREBALL 5
1.2 ESTRUCTURA 5
1.3 AVANTATGES I INCONVENIENTS TROBATS DURANT EL TREBALL 6

2. MISSATGES ENCRIPTATS. 7

3. HISTÒRIA DELS MISSATGES ENCRIPTATS 8


3.1 EDAT ANTIGA 8
3.2 EDAT MITJANA 9
3.3 EDAT MODERNA 10
3.4 EDAT CONTEMPORÀNIA 12
3.4.1 LA MÀQUINA ENIGMA 14
3.4.1.1 LA HISTÒRIA DE LA MÀQUINA ENIGMA 15
3.4.1.2 FUNCIONAMENT 17
3.5 USOS DELS MISSATGES ENCRIPTATS EN L’ACTUALITAT 21

4. DESENVOLUPAMENT DE DOS PROGRAMES INFORMÀTICS D’ENCRIPTAMENT 22


4.1 NOCIONS BÀSIQUES DEL PROGRAMA INFORMÀTIC 22
4.2 DISSENY I EXECUCIÓ DEL PROGRAMA 1 30
4.3 DISSENY I EXECUCIÓ DEL PROGRAMA 2 37

5. COMPARACIÓ DELS DOS PROGRAMES 43


5.1 DIFERÈNCIES ENTRE ELS PROGRAMES 43
5.2 SEGURETAT DELS DOS PROGRAMES 44

6. CONCLUSIONS 45
1. INTRODUCCIÓ
1.1 OBJECTIUS DEL TREBALL
Com tots els treballs de recerca, ja siguin treballs de final de grau, doctorats, treballs de final
de màster o, com en aquest cas, un treball de recerca de batxillerat, aquest treball té uns
objectius al darrera.
Al ser el primer treball d’aquesta magnitud que es realitza, es creu que s’ha de realitzar
d’una bona forma ja que, en un futur, es poden realitzar més treballs, semblants a aquest o
més significatius, amb els quals es podrà aplicar l’experiència i els coneixements adquirits
realitzant aquest treball.
El treball està focalitzat des de la vessant tecnològica i matemàtica. L’objectiu és
comprendre i explicar el funcionament matemàtic dels diferents mètodes d’encriptament i
desencriptament i explicar els secrets de les màquines o instruments que, al llarg de la
història, han encriptat els missatges.
Finalment, l’últim objectiu del treball és la programació i la comparació de dos programes
informàtics completament funcionals capaços d’encriptar i desencriptar qualsevol tipus de
missatges.
1.2 ESTRUCTURA
Com seria l'espècie humana si no haguessin existit mai els missatges encriptats? Per sort
no ha estat així i aquest treball recull tots els mètodes d'encriptament que s'han utilitzat al
llarg de la història, des de l'edat Antiga fins avui dia amb les noves tecnologies.
El treball s'inicia explicant què és un missatge encriptat.
Seguidament, es farà un viatge pel llarg de la història dels missatges encriptats, començant
per l'Edat Antiga amb el mètode de Juli Cèsar, l'instrument de l'escítala espartana i el
naixement de l'esteganografia. A l'edat mitjana es va crear l'anàlisi de freqüència, fet que va
canviar radicalment la manera de codificar missatges i va provocar que s'inventés el primer
mètode sustitucional polialfabètic, el mètode d'Alberti. A l'Edat Moderna es podrà veure el
xifratge de Vigènere. A l'Edat Contemporània es podrà veure un dels llenguatges codificats
més famosos de la història, el codi Morse, també en aquest punt el treball es focalitzarà en
la màquina Enigma, tant en la seva història com en el seu funcionament. Finalment, es
parlarà dels usos dels missatges encriptats avui en dia.
A continuació, es desenvoluparan dos programes informàtics capaços d'encriptar i
desencriptar missatges. Els dos actuaran amb el xifratge sustitucional de Juli Cèsar no
obstant això, el primer deixarà que l'usuari triï el codi, i el segon programa tindrà diversos
codis que permetran encriptar cada lletra amb un codi diferent de l'anterior.
Per concloure el treball es realitzarà una comparació entre els dos programes per
determinar quin és més segur.

5
1.3 AVANTATGES I INCONVENIENTS TROBATS DURANT EL TREBALL
En la realització d'aquest treball, es van trobar diferents avantatges i inconvenients que van
facilitar o complicar l'execució del treball.
Primerament, es va trobar la facilitat de trobar informació sobre el tema, amb una recerca a
internet es podia trobar moltes pàgines, algunes de fonts fiables i altres de no tan fiables,
amb molta informació molt útil.
Seguidament, va haver-hi problemes amb la comprensió del funcionament de la màquina
Enigma, ja que té un funcionament complicat i no totes les pàgines d'internet deien el mateix
sobre el tema.
Finalment, per una banda, en realitzar el programa informàtic es va haver d'aprendre un
llenguatge informàtic, fet que es va produir cursant diverses lliçons en línia durant tot l'estiu.
Per l'altra banda, no va ser senzill fer el codi del programa, després de molts errors lògics,
errors d'execució i errors de compilació, es va poder implementar el programa correctament.

6
2. MISSATGES ENCRIPTATS
Els éssers humans hem tingut sempre la necessitat de comunicar-nos amb altres individus,
des d'un bon inici, quan vivíem en coves i érem nòmades, ja ens comunicàvem, per
exemple, per poder caçar una presa, sobreviure o bé per explicar-nos petites anècdotes del
que ens havia durant el dia.

Amb el pas del temps la societat ha anat evolucionant igual que també ho ha fet la llengua.
En aquest aspecte, però ens hem adonat que perquè la comunicació sigui vàlida i efectiva
necessitem els següents elements:
● Emissor: qui envia el missatge amb la informació corresponent.
● Receptor: qui rep i interpreta el missatge que ha tramès l'emissor.
● Missatge: el contingut d'informació que envia l'emissor cap al receptor.
● Codi: el llenguatge usat per l'emissor per tal que el receptor el pugui entendre.
Perquè hi hagi comunicació, el codi utilitzat ha de poder ser xifrat per l'emissor i
desxifrat pel receptor.
● Canal: el medi per on es transmet el missatge.

Per aconseguir aclarir els conceptes anteriorment esmentats podem realitzar el següent
exemple:
Imaginem-nos que un individu està comprant en una carnisseria
Emissor: La persona que està comprant.
Receptor: El carnisser.
Missatge: Quantitat de carn que vol el comprador.
Codi: L'idioma en que s'expressa l'emissor. Podria ser en llengua catalana.
Canal: L'aire.

Així doncs, és evident que els humans necessitàvem continuar compartint informació, però
cada cop ho volíem fer amb un cercle més reduït de persones i sense que la resta pugui
desxifrar els missatges. Per poder realitzar aquesta necessitat, no servia emprar un
llenguatge utilitzat per més gent com poden ser els idiomes com el català, castellà, anglès...
o els llenguatges no verbals com el llenguatge de signes, el llenguatge de braille. Per tant,
vam haver d'inventar nous codis que només coneguessin l'emissor i el receptor. Així doncs,
van sorgir els missatges encriptats, missatges que no fan ús dels llenguatges coneguts per
tothom, sinó que usen llenguatges que només saben descodificar l'emissor i el receptor.

7
3. HISTÒRIA DELS MISSATGES ENCRIPTATS

3.1 EDAT ANTIGA


Com s’ha comentat anteriorment, els missatges encriptats no són un problema d’avui dia.
En l’època clàssica ja s’utilitzaven els missatges xifrats entre generals, filòsofs… perquè cap
interceptor pogués conèixer el missatge.

Inicialment, es va començar desordenant les lletres dels mots (‘bon dia’ esdevé ‘obn adi’) o
bé substituint les lletres per la següent en l’alfabet (‘bon dia’ esdevé ‘cpm ejb’). Aquests
missatges eren relativament senzills de descodificar així que es van crear altres maneres
d’encriptar missatges. Juli Cèsar substituïa les lletres per la que es trobava a 3 posicions
endavant en l’alfabet llatí. Aquest mètode va ser anomenat el Xifratge de Cèsar.

En aquesta mateixa època es va desenvolupar un instrument per codificar missatges.


Aquest era l’escítala espartana (figura 1). Aquest mètode de xifratge consistia en agafar una
bara o una escítala, enrotllar-hi una cinta amb el missatge escrit horitzontalment i en els
llocs on no està escrit el missatge, colocar-hi altres lletres aleatòries. Després es
desenrotllava la cinta i el missatge quedava totalment encriptat. Per desxifrar el missatge
s’havia d’agafar una escítala amb el mateix diàmetre, tornar a enrotllar la cinta i busca a
quina cara es trobava el missatge desxifrat.

Figura 1 Escítala espartana. Wikipedia.


https://es.wikipedia.org/wiki/Esc%C3%ADtala

També van ser utilitzats altres mètodes, com per exemple l’esteganografia, que consistia a
escriure missatges ocults, en aquest cas l’emissor no pretenia que l’interceptor no pogués
comprendre el missatge sinó que pretenia que l’interceptor no conegués l’existència del
missatge. Un exemple d’utilització d’aquest mètode era que en l’Antiga Grècia agafaven una
persona a l’atzar que tingués els cabells rapats que fes la funció de missatger, li tatuaven un
missatge i esperaven que li tornés a créixer el cabell. Així, si abans d’arribar al destinatari
l’enemic interceptava al missatger, no sospitaria de res.

8
3.2 EDAT MITJANA
Al segle IX, el matemàtic àrab Al-Kindí, va descobrir l’anàlisi de freqüència de lletres en els
missatges. Al-Kindí va observar que moltes lletres es repetien constantment en els
missatges i d’altres que apareixien en poques ocasions (per exemple, en el castellà les
vocals són molt comunes, ocupen al voltant del 45% del text, mentre que d’altres com la X,
W o K són molt poc comunes).
A partir d’aquesta observació, si en un missatge encriptat apareix molt sovint una certa
lletra, es redueixen les opcions que aquell símbol sigui un dels que apareixen amb menys
freqüència a l’idioma en qüestió. D’aquesta manera era molt més senzill deduir missatges i
els mètodes anomenats anteriorment perdien seguretat.
No va ser fins a finals de l’edat mitjana, el 1466, que Alberti inventà el primer sistema
sustitucional polialfabètic. És a dir, un mètode en què se substitueixen les lletres del text en
més d’una clau. La primera lletra o paraula s’encripta seguint una clau i la següent s’encripta
seguint una altre.
El mètode d’Alberti consistia a col·locar dos discos mòbils, un de petit i un de més gros
col·locats de manera que el petit estava a l’interior del gran. Es dividia el disc petit en totes
les lletres de l’alfabet mentre que el gran contenia un conjunt de 20 lletres i 4 números. El
disc petit contenia el missatge desencriptat i les lletres que corresponien en el text encriptat
es trobaven en el disc de major diàmetre.
D’aquesta manera, quan els discs estan en la mateixa posició que la fotografia següent
(figura 2), la paraula “prat” s’encriptaria “14dq”. Aquesta seria la paraula, però per tal que el
receptor del missatge pugui conèixer com desxifrar-lo, es col·locarà la lletra del disc mòbil
(el petit), que coincideix amb la lletra ‘A’ a davant de la paraula. Així ens quedaria la paraula
“prat” encriptada amb un disc d’Alberti que tingui la mateixa posició que la figura 2: “D14dq”.
Per tal de fer més segur el missatge, després de cada paraula, es rota el disc un altre cop i
la següent paraula encriptada comença de nou amb la lletra del disc petit que coincideix
amb la lletra ’A’ del disc gran.

Figura 2 Disc d’Alberti. Jose Luis Tabara.


https://joseluistabaracarbajo.gitbooks.io/criptografia-clasica/content/Cripto11.html

9
3.3 EDAT MODERNA
Tot i aquests avenços durant l’edat medieval, als primers segles de l’edat moderna es
continuaven utilitzant els mètodes més simples d’encriptament, que ja s’utilitzaven en l’edat
mitjana, com per exemple el de canviar una paraula per una altra que tingui un significat
totalment diferent segons una taula que compartien l’emissor i el receptor dels missatges.
Més endavant, la creació del cabinet noir va crear una gran demanda als científics per
inventar nous mètodes d’encriptament. Acàmeres sorgides a França permetien obrir, copiar i
desxifrar tots els missatges de gent important, com per exemple ambaixadors, que
s’enviaven a través del sistema de correus del país.
L’inventor d’un d’aquests nous mètodes d’encriptament va ser Giovan Battista Belasso, l’any
1553, tot i que es va atribuir erròniament a Blaise de Vigenère, qui li dona nom al mètode; el
xifratge de Vigenère. Aquest consisteix a dibuixar una taula de 26x26 (nombre de lletres de
l’abecedari), en aquesta taula s’hi escriu tot l’abecedari tant en horitzontal com en vertical i,
seguidament, en la següent fila i columna es torna a escriure l’abecedari, però començant
per la següent lletra, és a dir, primer s’escriu l’abecedari començant per la ‘a’, la següent
columna començarà per la lletra ‘b’ i així fins a arribar a la ‘z’. De manera que quedi una
taula igual que següent: (figura 3).

Figura 3 Taula del xifratge de Vigenère. Mikel García Larragan.


http://mikelgarcialarragan.blogspot.com/2015/03/criptografia-i.html

10
Per encriptar els missatges es necessitarà una paraula clau, que tant l’emissor com el
receptor coneguin. Aquesta paraula servirà per trobar un punt mig a la taula entre les lletres
de la paraula clau i la paraula que es vol encriptar. En el cas que vulguem encriptar la
paraula “Roma” i tenim la paraula clau “Mirar”, s’agafarà la primera lletra de “Roma” i la
primera de “Mirar”, ‘R’ i ‘M’, i es buscarà el punt mitjà en aquesta taula, que és la lletra ‘D’.
Seguidament, es fa el mateix amb les lletres que estan en segona posició, en aquest cas la
‘o’ i la ‘i’ que tenen de punt mitjà la lletra ‘w’. Es repeteix el procés amb totes les lletres de la
paraula. Així doncs, la paraula encriptada seria ‘Dwda’.
Per desencriptar aquesta paraula haurem d’agafar la paraula clau i fer el procés
inversament, mirar a on es troba la lletra de la paraula encriptada en la columna de la lletra
corresponent de la paraula clau. Per la paraula que hem encriptat abans, si utilitzem la
mateixa paraula clau, per descobrir quina lletra és la ‘D’, anem a la columna de la lletra ‘M’
(primera lletra de la paraula clau “Mirar”) i busquem en quina fila hi ha la ‘D’. Trobem que és
la ‘R’. Després es fa amb la resta de lletres.
Aquest mètode, també és un mètode sustitucional polialfabètic perquè estem intercanviant
una lletra per una altra però seguint un diferent codi per cadascuna.

11
3.4 EDAT CONTEMPORÀNIA
El 1835, Alfred Vail va crear un dels codis més famosos de la història, el codi Morse. Tot i no
ser una forma criptogràfica, ja que no tracta d’amagar el missatge, per enviar missatges
telegràfics s’havia de xifrar el missatge a través d’un codi. Es podria dir que és un altre
alfabet per poder comunicar-se telegràficament.
Aquest xifratge utilitza seqüències d’elements curts i llargs, punts i ratlles, per tal de
representar les diferents lletres i caràcters.
Així doncs, per poder enviar missatges i descodificar-los s’hauria de conèixer el codi
següent (figura 4).

Figura 4 Símbols del codi Morse. Autor desconegut.


http://blog-seguridad-de-la-informacion.blogspot.com/2015/10/padres-de-la-criptografia.html

Per exemple, si volguéssim enviar: ‘Firmeu la pau?’, en el telègraf teclejaríem ‘..-. .. .-. -
- . ..- .-.. .- .--. .- ..- .-.-.-’
Quan es vol passar informació per telègraf, és important que el teclejador marqui bé els
buits dels espais entre caràcters i paraules.
Al segle XX, enviar missatges sense que l’enemic els pugui llegir o entendre va ser un factor
clau, ja que durant aquesta etapa hi ha hagut diverses guerres de gran importància com són
la 1a i la 2a Guerra Mundial. A causa d’això van sorgir nous mètodes no tan sols
d’encriptament sinó també d’esteganografia o dels dos combinats.

12
Durant la 2a Guerra Mundial, Alemanya va utilitzar diferents mètodes per tal que els seus
missatges fossin indesxifrables o ocults. Un d’aquests mètodes consistia a amagar els
missatges dintre el punt d’una ‘i’ o en el punt final, aquest mètode correspon a
l’esteganografia, però els alemanys volien que el missatge fos més segur pel que, a part
d’amagar el missatge, també l’encriptaven. El mètode d’encriptament que seguien era
emprant una màquina revolucionària, la màquina Enigma.

13
3.4.1 LA MÀQUINA ENIGMA
La màquina Enigma (figura 5) és la màquina d’encriptació per excel·lència del segle XX i de
la 2a Guerra Mundial i es podria anomenar la màquina de codificació i descodificació més
famosa de tota la història.

Figura 5 Màquina Enigma. El Confidencial.


https://www.elconfidencial.com/tecnologia/2015-06-29/codigo-enigma-nazis-turing_907580/

14
3.4.1.1 LA HISTÒRIA DE LA MÀQUINA ENIGMA
L'Enigma va ser patentat l'any 1918, a finals de la Primera Guerra Mundial, i cofundada per
Arthur Scherbius. El 1926 l'armada alemanya va adoptar aquesta màquina per a l'ús militar i
seguidament va ser utilitzada per la resta de forces de l'exèrcit alemany.
Durant la Guerra Civil Espanyola, els nazis van subministrar 20 màquines Enigma al bàndol
franquista que van permetre una perfecta comunicació entre el general Franco i els seus
homes de confiança. Tot i això, els alemanys no els van vendre les millors màquines que
tenien, sinó que els van vendre unes màquines comercials per tal que els soldats soviètics,
que lluitaven a favor dels republicans, no els robessin la màquina i en descobriren els
secrets.
Després de l'èxit de la màquina a Espanya, els nazis no van dubtar en usar-la durant la
Segona Guerra Mundial. Tots els soldats tenien una llibreta amb tots els codis de cada dia
del mes, cada dia els soldats havien de canviar l'ordre dels rotors, col·locar la primera lletra
de cada rotor correctament i fixar la posició de l'anell mòbil amb la lletra correcta.
L’exèrcit britànic va crear un organisme totalment secret format per els traductors,
matemàtics i criptoanalistes més famosos del país amb la funció de desxifrar el
funcionament d’Enigma, un d’ells era el matemàtic Alan Turing.
Alan Turing i el seu equip van aconseguir desxifrar Enigma creant un dispositiu
electromecànic, la Bombe (figura 6). Gràcies a aquest dispositiu, a més d’altres estudis,
Turing és considerat un dels pares de la ciència de la computació.

Figura 6 Bombe, computadora de Turing. WIkimedia Commons / Maksim / CC BY-SA 3.0.


https://www.lavanguardia.com/historiayvida/historia-contemporanea/20180611/47312986353/que-aporto-a-la-cie
ncia-alan-turing.html

15
3.4.1.2 FUNCIONAMENT
Tot i que a simple vista pot semblar una màquina d’escriure usual, el seu funcionament és
molt més complexe. L’aparell, està format per quatre parts essencials: un teclat, una secció
de redreçament, un engranatge mecànic i un panell de resultat.

● Teclat: conté 26 tecles que un cop pulsades, emeten un impuls elèctric cap a la
secció de redreçament.

Figura 7 Teclat màquina Enigma. Baloncici.


https://es.dreamstime.com/teclado-de-enigma-botones-codificaci%C3%B3n-alemanes-del-la-m%C3%A1quina-i
mage147752678

● Secció de redreçament: serveix per connectar dues lletres, d’aquesta manera quan
es prem un caràcter, l’impuls elèctric passa per l’altre. Tot i això, no és essencial tenir
els caràcters connectats.

Figura 8 Secció de redreçament. Autor desconegut.


https://www.curistoria.com/2020/04/como-funcionaba-la-maquina-enigma.html

● Engranatge mecànic: està format un reflector i diversos rotors, comunament


s’utilitzaven tres rotors.

Figura 9 Rotors i reflector de l’Enigma. Antse.


https://www.youtube.com/watch?v=aI7Qrr2OBuA

16
● Panell de resultat: conjunt de bombetes que s’il·luminen per il·lustrar el resultat.

Figura 10 Panell de resultat. Alamy


https://www.alamy.es/imagenes/m%C3%A1quina-clave-enigma.html

Abans de començar amb l’explicació del funcionament de la màquina Enigma, es veurà un


vídeo explicatiu amb un exemple: La Máquina Enigma

El primer pas per encriptar un missatge és clicar una de les vint-i-sis tecles del teclat. Un
cop realitzat el gest, s'envia un impuls elèctric en direcció a la secció de redreçament. Si
s'escau que la lletra polsada està connectada a una altra en la secció de redreçament,
l'impuls es transmetrà cap a l'engranatge mecànic a través d'aquesta segona. En cas
contrari, l'impuls arribarà directament per la lletra clicada.Un cop arribat a l'engranatge,
apareix la figura dels rotors. En la majoria de casos n'hi ha tres. Cada un d'ells conté dos
discos plans amb vint-i-sis contactes elèctrics a cada cara. Cosa que fa que es puguin
connectar entre ells. Els dos discs no són iguals, ja que un és més gran que l'altra. Els discs
tenen l'alfabet i cada lletra d'un disc està connectada, a través d'un cable elèctric per el qual
passa l'impuls elèctric, a la mateixa de l'altra disc. Tanmateix, entre rotors, les lletres també
estan connectades a través d'un cable, aquest cop per posició i no per lletra. És a dir, entre
disc major i menor del mateix rotor les connexions són entre la mateixa lletra i entre disc
menor i disc major de diferents rotors la connexió és entre lletres situades en el mateix punt
del rotor. Per tal que mai se substitueixi una lletra per una altra mateixa, els rotors avancen
una posició de la següent manera: el primer rotor avança una posició cada vegada que es
polsa una tecla; el segon rotor avança una posició quan el primer rotor fa una volta
completa, és a dir, després de vint-i-sis caràcters; el tercer rotor recórrer una posició quan el
segon rotor completa tota la rotació completa, al cap de 676 tecles. Aquestes rotacions ens
permeten gairebé infinites combinacions per no ser desxifrats. També és per culpa
d'aquestes rotacions que les posicions inicials dels tres rotors són imprescindibles per poder
desxifrar el missatge posteriorment.

17
Als rotors comença l'encriptació. L'impuls es rep en el disc petit del primer rotor. La lletra
que l'ha rebut està connectada a aquesta mateixa del disc major. Coincideix en la lletra,
però la posició pot ser totalment diferent. Aquesta està connectada directament al caràcter
que es troba en la mateixa posició del disc menor del segon rotor. Aquest últim caràcter està
connectat a la mateixa lletra del disc major i fa el mateix recorregut que s'ha esmentat
anteriorment, l'impuls arriba a la lletra que es troba en la mateixa posició del disc menor del
tercer rotor. Aleshores passa a la mateixa lletra del disc major del rotor.Després que es
compleixi el procés al tercer rotor, un altre cable connecta l'última lletra amb una altra del
reflector que farà tornar l'impuls cap al panell de resultat. Tal com diu el seu nom: reflecteix.
Així doncs, la lletra del reflector també està connectada amb la mateixa lletra del disc gran
del tercer rotor. Aquesta última està connectada a la mateixa lletra del disc petit i així fins a
arribar a una lletra del disc petit del primer rotor que enviarà l'impuls elèctric al panell de
resultat on es mostrarà la lletra encriptada a través de les bombetes que conté.

Seguidament, es podrà observar un altre exemple pràctic per acabar de comprendre-ho.


Es col·loquen els rotors amb la posició A/A/A de manera que cada lletra del disc major està
connectada a una altra del disc menor.

Figura 11. Plantilla d’exemple de la màquina Enigma.

18
Arran del polsament d'una lletra, per exemple la 'K', el rotor 1 avançarà una posició,
col·locant els rotors amb posició B/A/A. L'impuls elèctric viatjarà cap a la lletra 'V' del disc
menor del primer rotor. Aquesta està connectada a la 'V' del disc major del mateix rotor. La
'V' del disc major està connectada a la lletra que es troba en la mateixa posició del disc
menor del rotor 2, la lletra 'B'. Aquesta 'B', situada al disc menor del segon rotor, està
connectada a l'altra 'B' del disc major del mateix rotor. La 'B', seguint el mètode esmentat
anteriorment, està connectada a la lletra que es troba en la mateixa posició del disc petit del
tercer rotor, la lletra 'F'. La 'F' està connectada a la 'F' del disc major de l'últim rotor.
Finalment, la 'F' està connectada per posició a una lletra del reflector, la 'C'. Com totes les
lletres del reflector, la 'C' també està connectada a una altra lletra del tercer rotor que
correspon a aquesta, en aquest cas, la 'C'. En aquest punt comença el retorn. La 'C' del disc
major està connectada a la 'C' del disc menor. La 'C' està connectada per posició a la 'G' del
disc major del segon rotor. La 'G' està connectada a la 'G' del disc petit. La segona 'G' a la
'B' del disc gran del primer rotor i aquesta última a la 'B' del disc menor. En últim lloc, per
posició, la 'B' està connectada a la 'P' de sortida.

Figura 12. Exemple complet del funcionament intern d'un engranatge mecànic de la màquina Enigma

19
3.5 USOS DELS MISSATGES ENCRIPTATS EN L’ACTUALITAT
Quan es parla de missatges encriptats, sembla que es parli d'un tema del passat, a tothom li
sembla que ja ningú codifica o amaga els seus missatges.Recentment, un exemple on es va
fer servir l'esteganografia va ser en els atemptats de l'onze de setembre de Nova York. Els
terroristes es passaven els plans de l'atac en imatges que aparentment eren inofensives,
però que contenien tota la informació amagada en els megapíxels, punts gairebé
microscòpics que formen una fotografia a través del seu color, en una fotografia poden
haver-hi més de dotze megapíxels o, cosa que és el mateix, dotze milions de píxels.
Avui en dia, la criptografia està focalitzada en les noves tecnologies. Encara que no ens ho
sembli, els missatges encriptats estan molt presents en el nostre dia a dia. Quan obrim una
aplicació com el Whatsapp, un dels primers missatges que surt és el següent: "Els
missatges estan xifrats d'extrem a extrem. Ningú fora d'aquest xat, ni tan sols WhatsApp, els
pot llegir o escoltar." Amb això, l'empresa nord-americana vol anunciar als seus clients que
estan seguint un procés d'encriptament per tal que ningú pugui accedir als missatges, ni a
l'empresa. Per poder encriptar els missatges de manera que ni ells mateixos puguin accedir
als missatges es va dissenyar un programa informàtic que generava totes les claus per
encriptar el missatge i que només quedés registrat en els mòbils dels missatgers i es
pogués encriptar només d'enviar el missatge i desencriptar-lo a l'instant que es rep el
missatge. Cada codi és únic i només és utilitzat per un xat, és a dir, per cada persona amb
qui xategem utilitzem un codi diferent. Per garantir tota la seguretat, els servidors de
Whatsapp no guarden els missatges remesos, sinó que es guarden en l'emmagatzematge
del mòbil usat.
Un altre ús actual dels missatges encriptats són els missatges militars o entre alts càrrecs
de països. Aquests fan ús sistemes ultrasecrets gairebé impossibles de desxifrar. A més,
gairebé tots els missatges es passen a través de programes informàtics d'extrema seguretat
impossibles d'accedir-hi.

20
4. DESENVOLUPAMENT DE DOS PROGRAMES INFORMÀTICS
D’ENCRIPTAMENT
Seguidament es realitzarà la part pràctica, la part que per a nosaltres és la més important i a
la que hi hem posat més dedicació, el disseny i posada en funcionament de dos programes
informàtics capaços d’encriptar i desencriptar missatges.

4.1 NOCIONS BÀSIQUES DEL PROGRAMA INFORMÀTIC


Per poder crear un programa informàtic es necessita una aplicació que permeti escriure i
executar el codi. En aquest cas s'ha utilitzat l'aplicació gratuïta de Microsoft, el Visual Studio
Code.
El codi no es pot escriure amb un idioma qualsevol (com el català, el castellà o l'anglès),
sinó que s'ha d'escriure amb un llenguatge especial, així doncs s'ha emprat el llenguatge
C++("C plus plus"), un llenguatge que prové del C i que va ser creat el 1983.
Per aprendre aquest llenguatge es va utilitzar un curs gratuït en línia a la web de
Codecademy: https://www.codecademy.com/

El llenguatge C++, com la majoria de llenguatges, llegeix el codi de dalt a baix i d'esquerra a
dreta. L’estructura que ha de seguir un llenguatge C++ és la següent: (vegeu també la figura
13).
1. Llibreries. Tots els programes han d’incloure les llibreries, aquestes serveixen per
poder incluir una sèrie d’opcions al programa. Si no s’inclouen, algunes funcions no
es podran llegir.
2. La “main function”. Ho trobarem al codi com a “int main()”. A l’interior d’aquesta
funció és on s’escriurà el codi. L’ordinador realitzarà les accions escrites dins de la
funció.
3. Les claus. Trobarem les claus després de la “main function” i abans del codi escrit.
Obrim la clau després dels parèntesis del “main” i el tanquem després d’escriure tot
el codi.

Figura 13. Estructura d’un programa en C++


https://www.codecademy.com/courses/learn-c-plus-plus/lessons/cpp-compile-execute/exercises/review

21
Quan es codifica, al final de cada línia s'ha d'escriure un punt i coma. Es poden inserir
comentaris que el programa no llegeix amb dobles barres, serveixen per aclarir el què passa
en cada part del programa al programador.

Compilar:
L'ordinador no pot entendre el codi tal com l'escrivim així que abans d'executar el programa,
l'hem de compilar, compilar és la transcripció del codi que s'escriu a un altre codi que només
entén l'ordinador, aquesta transcripció la realitza automàticament el programari amb el qual
es treballa. Seguidament, es podrà executar el programa.

Variables:
Per emmagatzemar dades s'han utilitzat diferents tipus de variables. Les variables tenen:
tipus, nom i valor.
Els caràcters sols s’emmagatzemen en “char”.
Les frases i textos es desen en “string”. Tenen índex, és a dir, cada caràcter i espai que
forma part del “string” té assignat un valor, el caràcter que està en primera posició té el valor
zero. Es pot obtenir un sol caràcter escrivint el nom de la variable acompanyat seguidament
de la posició que ocupa el caràcter que volem obtenir entre claudàtors.
Finalment, per emmagatzemar números, s’utilitzen els “int”.
Per donar el valor a les variables vegeu Figura 14.

Figura 14. Declaració i inicialització de variables.


Per escriure missatges al programa directament es pot utilitzar el següent comandament:
“std::cout << “ seguit del missatge que es vulgui escriure entre cometes. Si es vol saltar de
línia es pot fer usant “\n” entre les cometes.
Si es vol escriure missatges al programa ja escrits en un string només s’ha de seguir el
mateix comandament seguit del nom del “string”.

Figura 15. Comandament per escriure


missatges al programa.
Per tal que l’usuari pugui escriure al programa s’utilitza el comandament: “std::cin >> ” seguit
del nom de la variable on es vol emmagatzemar la informació donada per l’usuari.

22
Figura 16. Comandament per escriure missatges al programa i que
l’usuari també hi pugui escriure.

Condicionals i lògica:
Quan es vol que passi una cosa en el programa però només si abans ha passat una sèrie
de coses es pot utilitzar el condicional “if”. . Així doncs, només s’executarà aquest codi si
passa la condició de dintre l’if. Per escriure el condicional vegeu Figura 17.

Figura 17. Estructura del condicional. En el cas que la variable


numero equivalgui a un número més gran que dotze, s’executarà
l’oració “El teu número és més gran que 12”.

Si es vol executar un altra codi quan l’if és fals s’escriu “else”. Per l’estructura vegeu Figura
18.

Figura 18. Estructura de l’else. Si la magnitud de la variable


numero és més gran que 12, el programa reproduirà la frase “El
teu número és més gran que 12”, per contra, si aquesta condició
no és certa, és a dir, la variable numero és dotze o més petit que
dotze, el sistema imprimirà “El teu número és més petit que 12”.

23
En cas que volem afegir més d’una condició podem afegir un “else if”. Aquest té la mateixa
estructura que l’if (vegeu figura 19). Es pot afegir tantes condicions més com es vulgui.

Figura 19. Estructura de tots els condicionals. Si el valor de la


variable ‘numero’ és més gran que 12, el programa imprimirà: “El
teu número és més gran que 12”, si el valor de ‘numero’ és més
petit que 12, s’imprimirà “El teu número és més petit que 12”, i si
el teu número no compleix cap de les condicions anteriors, és a
dir, és 12, es reproduirà “El teu número és igual a 12.

Dins les condicions de l’if i l’else if, podem trobar els següents operadors lògics:
== → igual.
< → més petit que.
<= → més petit o igual que.
> → més gran que.
>= → més gran o igual que.
&& → es tradueix com la conjunció ‘i’. S’utilitza quan s’ha de complir més d’una condició
perquè s’executi el codi.
| | → es tradueix com la conjunció ‘o’. S’utilitza quan s’ha de complir o una cosa o una altra
perquè s’executi el codi.
!= → no és igual a.

Uns altres operadors són els que es poden utilitzar en qualsevol lloc del codi:
+ → suma
+= → un valor és igual al que tenia anteriorment més un altre valor que se li vol donar.
++ → s’utilitza abans o després del nom d’una variable de tipus int, suma u al valor inicial.
- → resta
-= → un valor és igual a la resta del valor que tenia anteriorment menys l’afegit.

24
- - → s’utilitza abans o després del nom d’una variable de tipus int, resta u al valor inicial.

Si es vol que en el cas que quan una variable val un valor, passi una cosa; quan té un altre
valor en passi una altra; si en té un altre, passi una altra cosa etc.; s’escriu el “switch”.
Només realitzarà una acció en el cas que una variable tingui un valor concret; si en té un
altre, es realitzarà una altra acció. El switch va acompanyat d’una variable i de la paraula
“case”. Per cada cas utilitzem la paraula “case” acompanyada del valor concret de la
variable i de dos punts. Seguidament, s’escriu el codi i per tancar el cas s’escriu “break”.
Vegeu figura 20.

Figura 20. Estructura switch. En el cas que la


variable numero sigui 1, el programa imprimirà
“El teu número és l’1, si la variable val 2,
imprimirà “El teu número és el 2” i si numero val
3, “El teu número és el 3”.

Bucles
A vegades, es vol que una part del codi es continuï executant fins que una certa condició
deixa de ser verdadera, en aquest moment entren els bucles.
Hi ha dos tipus de bucles, el “while” i el “for”.
El més senzill és el “while”, mentres un valor declarat anteriorment en una variable compleixi
una condició, s’anirà repetint el codi de dins. Només necessita que se li inclogui una
condició i un codi de la mateixa manera que l’if. (Vegeu figura 21.)

25
Figura 21. Estructura del while. Sempre que la variable numero sigui més petita o igual a 10, el programa
imprimirà “El quadrat del numero (valor de la variable) es: (numero * numero)”.

Per veure el resultat d’un bucle del tipus “while” vegeu Figura 22.

Figura 22. Resultat que dona el


programa un cop executat.
La diferència entre el “while” i el “for” és que dintre el “for” pots crear una variable dins del
bucle i fer-lo créixer o decréixer, també pots posar un límit de creixement o de decreixement,
aquestes condicions es separen amb un punt i coma. Així doncs el “for” serveix per crear
programes més complexes i no haver de declarar variables que només et poden servir en
un bucle. (Vegeu figura 23.)

Figura 23. Estructura del for. Es declara una variable de tipus “int” amb nom ‘i’ que
se li dona un valor de 0. A continuació, separat d’un punt i coma, es marca el límit
de la variable, es continuarà el bucle fins que ‘i’ adquireixi un valor més gran que
10. Tot seguit, s’indica que cada cop que s’acabi l’acció del codi, la variable ‘i’
augmentarà u.

26
El resultat d’aquest codi (vegeu figura 23.) és exactament igual el que s’ha vist anteriorment
(vegeu figura 22.).
Dins un bucle “for”, es pot fer que el límit de creixement o decreixement de la variable
declarada sigui, per exemple, la llargada d’un “string” (unitat d’emmagatzematge d’oracions)
amb diferents comandaments. En aquest cas s’utilitzaria el “.lenght()”. La seva estructura és
molt senzilla, només s’ha de posar el nom de la variable davant del “.lenght()”.

Funcions:
Quan es necessita un mateix codi en molts i diferents llocs, es creen les funcions, que
permeten escriure en una línia de codi el que s’hauria d’escriure en moltes, també eviten que
es repeteixi tota l’estona el mateix. Aquestes tenen tipus, nom i valor.
Es té accés als avantatges de les funcions quan es “criden”. Per cridar-la només s’ha
d’escrirue el seu nom i col·locar un valor dins dels parèntesis, que farà la funció d’argument.
(Vegeu figura 24).

Figura 24. La funció sqrt està cridada. En


aquest cas, el programa imprimirà l’arrel
quadrada del valor entre els parèntesis, el
9, és a dir, imprimirà 3.

Abans de cridar-la, però, s’ha de declarar i després definir. Quan es declara una funció, es
posa el tipus que serà, tota variable té la seva funció, el nom que tindrà i el paràmetre, que
indica el tipus de valor que acceptarà la funció, aquests poden ser tants com es vulguin i van
separats per una coma. Un cop la cridem, a l’argument hi haurà d’haver tants valors com
paràmetres a la declaració i hauran d’estar ordenats de la mateixa manera que estan
ordenats a la declaració.

La definició d’una funció és el codi que hi ha dins, és el que es realitzarà quan es cridi la
funció. Normalment, es defineix una funció a sobre de la funció principal “int main()”.

Les funcions retornen valors, aquests s’escriuen al final de la definició i han de ser del
mateix tipus que el de la funció. Els valors retornats, només incideixen en el codi quan la
funció és cridada.

27
Figura 25. Exemple de funció de tipus int, amb el nom
“obtenir_propina” i amb dos paràmetres de tipus int amb nom
preu i propina. Aquesta funció retornarà els valors preu i propina
sumats. Quan es crida es posen els arguments, 25 i 2, que
correspondran al valor preu i propina tal com estan col·locats. El
resultat del codi serà la suma 2 + 25 = 27.

Constant.
En el cas que es vulgui que un o una sèrie de valors es repeteixi es pot crear una constant.
Aquesta es crea a partir del tipus de valors que emmagatzema, el nom de la constant, el
nombre de valors constants que hi haurà i els valors. Es segueix l’estructura: “static const
variable nom_variable[ nombre de valors ] = { valors, separats, per, comes} ; ”
Quan es vol codificar amb un valor en concret de tots els que té la constant s’ha de fer
col·locant el nom de la constant seguit de claudàtors amb el número de la posició que ocupa
entre els valors de la constant tenint en compte que la primera posició respont al número
zero.
Així doncs, si es vol que cada cop que passi una cosa el codi utilitzi un número diferent de la
constant es pot crear una variable “int” que tingui valor zero o el valor màxim de posicions
(número de valors menys u). S’escriu el nom de la funció, dins de l’argument escrivim el nom
d’una variable que tingui índex, després, entre claudàtors escrivim el nom de la primera
variable, de tipus “int”. Aquesta actuarà com el valor que té, si té el valor zero el valor de la
constant serà el primer. Seguidament s’haurà d’augmentar o disminuïr una posició la
constant, per tant, es farà augmentar o disminuïr la variable tantes unitats com es vulgui.

28
4.2 DISSENY I EXECUCIÓ DEL PROGRAMA 1
Abans de començar amb el codi es va pensar en com poder realitzar les funcions del
programa. Primerament, es tracta d’un sistema d’encriptament del mètode de desplaçament
de Juli Cèsar que, com s’ha esmentat anteriorment, es substitueix cada lletra per la seva
posterior en l’alfabet. Cada lletra de l’alfabet té assignat un número. El programa demana
una clau. Aquesta clau és el número que se li suma al valor numèric de cada lletra,
convertint-la així en una lletra adelantada a l’abecedari tantes vegades com el valor del codi.
Així doncs, per encriptar una lletra se li suma la clau al valor de la lletra, aleshores, la suma
representa un altra caràcter i es pot produir l’encriptament. En el cas de desencriptar, el
programa realitza el mateix procés però a l’inversa, demana el codi i en aquest cas no el
suma al número que representa la lletra, sinó que li resta per tal que torni a la lletra
encriptada.
Per tal d’una comprensió més senzilla es realitza un exemple en format reduït fins la lletra
‘J’.

1 2 3 4 5 6 7 8 9 10

A B C D E F G H I J

Amb aquesta taula tenim el primer pas de l’encriptament, s’ha assignat un número per cada
lletra. A l’inserir la clau, aquesta se suma al número que representa la lletra en qüestió. Si la
clau és igual a 3, llavors la taula queda de la següent manera:

1+3=4 2+3=5 3+3=6 4+3=7 5+3=8 6+3=9 7+3=10 8+3=11 9+3=12 10+3=13

D E F G H I J A B C

Així doncs, la lletra ‘A’ s’ha convertit en la ‘D’, la ‘B’ en la ‘E’ i així consecutivament. Com es
pot observar, quan s'acaben els números de la taula, aquesta ha de tornar a començar, en
el cas de la programació, el que s’ha fet és restar a la suma de la clau, el nombre total de
lletres que hi ha, és a dir, perquè la ‘I’ es converteixi en la ‘B’ s’ha fet la següent operació.
(𝑃𝑜𝑠𝑖𝑐𝑖ó 𝑑𝑒 𝑙𝑎 𝑙𝑙𝑒𝑡𝑟𝑎 + 𝑐𝑙𝑎𝑢) − 𝑡𝑜𝑡𝑎𝑙 = 𝑝𝑜𝑠𝑖𝑐𝑖ó 𝑙𝑙𝑒𝑡𝑟𝑎 𝑒𝑛𝑐𝑟𝑖𝑝𝑡𝑎𝑑𝑎
(9 + 3) − 10 = 2 → el número 2 correspon a la ‘B’.
Alhora de desencriptar s’obté el mateix problema, quan el programa encripta amb la lletra
‘B’, ha de tornar la lletra ‘I’. Així doncs, el que s’ha fet és sumar a la resta de la clau a la
lletra, el nombre total de lletres que hi ha. Per tal que la ‘B’ torni a la ‘I’ s’ha fet l’operació
següent.
(𝑃𝑜𝑠𝑖𝑐𝑖ó 𝑑𝑒 𝑙𝑎 𝑙𝑙𝑒𝑡𝑟𝑎 − 𝑐𝑙𝑎𝑢) + 𝑡𝑜𝑡𝑎𝑙 = 𝑝𝑜𝑠𝑖𝑐𝑖ó 𝑙𝑙𝑒𝑡𝑟𝑎 𝑑𝑒𝑠𝑒𝑛𝑐𝑟𝑖𝑝𝑡𝑎𝑑𝑎

29
(2 − 3) + 10 = 9 → el número 9 correspon a la lletra ‘I’.
A continuació es seguirà amb l’exemple donat anteriorment.
Es realitzarà la taula anterior tal com l’interpretarà el programa. Amb les operacions de
retorn quan es sobrepassa el límit de lletres.

1+3=4 2+3=5 3+3=6 4+3=7 5+3=8 6+3=9 7+3=10 8+3=11 9+3=12 10+3=13
11-10=1 12-10=2 13-10=3

D E F G H I J A B C

Evidentment, en el programa no tindrem només deu lletres, sinó que hi ha vint-i-sis lletres
pel que quan realitzem la resta, quan encriptem, o la suma, quan desencriptem, en comptes
de deu haurem de realitzar les operacions amb el vint-i-sis.

Un cop es té pensada la forma com actuarà el programa, es comença a escriure el codi.


En primer lloc, inclourem les llibreries necessàries, informació que facilita el propi editor de
codi. S’han inclòs les llibreries: “<iostream>”, “<stdio.h>”, “<conio.h>” i “<cstring>.
En segon lloc es començarà donant un valor a totes les lletres de l’abecedari, incloent-hi un
caràcter especial que farà la funció de l’espai, ja que el programa no deixa fer servir l’espai
normal, al codi aquest caràcter serà la barra ascendent (/). Per treballar amb valors més
còmodes, assignarem a la lletra ‘a’ el valor 1, la lletra ‘b’ el valor 2 i així consecutivament
fins arribar a la lletra ‘z’ amb valor 26. Tot aquest procés el farem a través de dues funcions:
- La funció “numerolletra” de tipus “int” i amb paràmetre “char lletra”. Aquesta funció
permetrà que el programa cada cop que llegeixi una lletra, la converteixi en un
número. Aquesta conversió es realitzarà a partir d’un switch de la variable lletra de
dins la funció que per cada lletra retornarà un valor. La funció tindrà un valor de
retorn 0.
- La funció “lletranumero” de tipus “char” amb paràmetre “int numero”. La mencionada
provocarà que el programa un cop té la lletra convertida a número, pugui convertir el
número a lletra. Això també es realitzarà a partir d’un altra switch amb la variable de
tipus “int” amb nom “numero”. La funció també tindrà un valor de retorn 0.

En tercer lloc, s’inicia la declaració de variables. Es necessita una variable que l’usuari pugui
triar si vol encriptar, desencriptar o tancar el programa, aquesta variable és de tipus “int” i té
el nom de “mode”. Seguidament es declara un “int” on es guarda la clau que insereix l’usuari
i amb la que s’encripta el missatge. Aquest missatge també s’emmagatzema en una
variable de tipus “string” amb el nom de “missatge”. Quan es vol desencriptar també
s’insereix un missatge, aquest es guarda en un altre “string” anomenat “missatge2”. A

30
continuació es declara l’últim “string”, el missatge resultant de l’encriptació o la
desencriptació, té el nom de “missatge_nou”. Per últim però no menys important, es declara
un “int” amb nom “aux” que serveix a l’hora de codificar i descodificar.
Seguidament, es comença l’estètica que tindrà el programa i la inicialització dels modes que
conté. Es crea un bucle “while” que mentres l’usuari no decideixi tancar el programa es
segueixi mostrant el menú on pot triar si vol encriptar, desencriptar o tancar el programa.
L’usuari tria amb el comandament “std::cin >>” la informació que aporta s’emmagatzema a
l’”int mode”, si vol encriptar ha de prémer l’u, si vol desencriptar el dos i si vol tancar el
programa el tres.

Sempre i quan “mode” no sigui tres, el programa demana la clau amb la qual es treballarà a
posteriori, també es demana a través del comandament “std::cin >>” i es guarda a “clau”.

En el cas que l’usuari decideixi encriptar, el sistema demana a l’usuari que escrigui el
missatge que encriptar, aquest es guarda a “missatge”. A partir d’aquest moment comença
la codificació del missatge. El primer pas és crear un bucle que analitzi independentment
totes les lletres del missatge començant per la primera, el pas es realitza a través d’un bucle
“for”, amb la creació d’una variable de tipus “int” amb nom ‘i’ que inicialment té el valor de
zero, ‘i’ creix u cada vegada que es produeixi el codi de dins del bucle amb l’acció ‘i++’ i té
com a límit la mida del missatge amb el comandament “missatge.length()”. En segon lloc,
sempre que una lletra del missatge no sigui un espai, ja que la terminal no deixa col·locar un
sol espai i que funcioni el programa, la variable “aux” serà igual al valor numèric de la funció
“numerolletra” amb argument una lletra del missatge, la última part s’aconsegueix a través
de “missatge” amb índex [ i ], això fa que quan ‘i’ és igual a zero el argument de la funció es
converteixi en la primera lletra de “missatge”. El tercer pas és que quan l’usuari col·loqui una
barra per separar les paraules, és a dir, “aux” és igual a menys u (l’índex [ i ] detecta que la
següent lletra a codificar és una / i la funció “numerolletra” converteix la barra en un menys
u) s’integri una barra dins el missatge resultant, és a dir dins “missatge_nou” això
s’aconsegueix amb el comandament: missatge_nou += lletranumero(-1); la funció
“lletranumero” amb argument menys u permet convertir el menys u en una barra, el més
igual permet que la barra quedi guardada dins del missatge resultant. Seguidament, s’ha de
crear un codi en el cas que hi hagi lletres que el programa pugui encriptar, en aquest cas es
crea un “if” amb condició que la suma de “aux” més “clau” sigui menor o igual a vint-i-sis, ja
que en aquest cas es pot incloure a “missatge_nou” exactament la lletra que correspongui el
valor de la suma “aux” més “clau”, la conversió del valor de la suma a lletra es realitza a
través de la funció “lletranumero” amb argument la suma dita anteriorment. Recordatori,
“aux” correspon al valor de la lletra sense encriptar, quan li sumem la clau obtenim el valor

31
assignat a la lletra encriptada. El problema és quan la suma “aux” més “clau” és major que
vint-i-sis ja que no existeix cap lletra que tingui assignat un valor superior a vint-i-sis, llavors
es vol que torni a començar, és a dir, que després de la ‘z’ vingui la ‘a’, després del vint-i-sis
vingui l’u. Per això es necessita restar vint-i-sis a la suma del valor de la lletra que es vol
encriptar i la clau. Així doncs, s’ha d’escriure el codi d’abans amb una petita modificació, el
missatge resultant és igual al valor de la funció “lletranumero” amb argument la suma “aux”
més “clau” menys vint-i-sis. Finalment només s’haurà d’imprimir el missatge resultant.

En el cas contrari a l’anterior, és a dir, l’usuari decideix desencriptar, es segueixen els


mateixos passos comentats anteriorment: en primer lloc es demana el missatge a
desencriptar i aquest es guarda en un “string” anomenat “missatge2”. En segon lloc es crea
el bucle “for” per tal de poder analitzar lletra per lletra del missatge, es crea una variable de
tipus “int” amb nom “x” amb un valor inicial de zero, cada cop que s’acabi una acció del
bucle augmentarà u el seu valor i el seu límit és la llargada del missatge, amb el control
“missatge2.length()”. Seguidament, iniciem una condició en què mentres la lletra que busca
“x” no sigui un espai, es descodifica de la següent manera. El quart pas és igualar la
variable “aux” a la funció “numerolletra” amb argument “missatge2” en funció de l’índex que
ve donat per la variable “x”, igual que quan s'encripta, aquest pas permet convertir la lletra
en un número. A continuació, s’escriu que quan el valor de “aux” sigui igual a menys u, és a
dir, el missatge que ha insertat l’usuari conté un espai assignat amb una barra ascendent, el
programa ha d’incloure dins del missatge resultant, “missatge_nou”, una barra, aquesta
acció es realitza en el programa sumant a “missatge_nou” la funció “lletranumero” amb
argument menys u, aquesta funció converteix els números en lletres segons les
assignacions que es fan quan es defineix la funció, en aquest cas el menys u el converteix
en la barra ascendent. Per desencriptar, hem de restar al valor de la clau al valor de la lletra
encriptada, per tornar així al valor de la lletra original. Així doncs, hem de capgirar tots els
signes de suma a resta. Consegüentment, en cas que el resultat de la resta de les variables
“aux” menys “clau” sigui positiu, al missatge descodificat, s’afegeix la lletra que respon al
valor de la resta, aquest procés es codifica amb la variable “lletranumero”, que converteix
els números en lletres, amb argument aquesta resta. Quan la resta comentada és negativa
o zero, menor o igual que zero, no hi ha cap lletra que correspongui a un d’aquests valors,
no obstant, es vol que si a la lletra ‘a’ se li resta u es converteixi en la lletra ‘z’, ja que quan
s’encripta la lletra ‘z’ quan se li suma u es converteix en la lletra ‘a, així doncs es vol que u
menys u sigui igual a vint-i-sis de manera que sempre que la resta sigui negativa s’haurà de
sumar vint-i-sis al valor obtingut. Al missatge resultant se li afegeix la conversió del valor de
la resta de “aux” menys “clau” més vint-i-sis a la lletra que li correspon a través de la funció

32
“lletranumero” amb argument aquesta operació. Per últim, s’ha d’imprimir el missatge
resultant, “missatge_nou”.

Quan l’usuari decideix tancar el programa, escull el mode tres, s'imprimeix un missatge que
diu “A reveure!” i es tanca.

Es pot observar tot el codi a través de la web:


https://github.com/oleguer8/codicesar/blob/main/codicesar2.cpp

Un cop conegut el codi del programa, s’observarà l’execució d’aquest des de punt de vista
de l’usuari que l’utilitza.
El programa s’inicia amb el menú principal (vegeu figura 26), on s’ha d’escollir si es vol
encriptar un missatge, desencriptar-lo o tancar el programa inserint el número que
correspon a cada acció.

Figura 26. Menú del programa, seleccioni el mode (1,2 o 3).


1- Encriptar. 2- Desencriptar. 3- Tancar el programa.

En cas que es triï l’opció u o la dos sortirà el mateix missatge, el programa demana la clau
amb la qual es treballa.

Figura 27. El programa demana la clau.

33
L’usuari tria la clau i prem intro. En el cas que l’usuari hagi triat l’opció d’encriptar li surt a la
pantalla un escrit que li demana el missatge per encriptar.

Figura 28. L’aplicació demana el missatge a encriptar utilitzant minúscules i per separar
utilitzar la barra ascendent.
Un cop s’ha escrit el missatge i s’ha pres enter, el programa ofereix el missatge encriptat i
torna al menú inicial.

Figura 29. El programa codifica el missatge “hola/mon” a “jqnc/oqp” i retorna al menú inicial.

En cas que el programa hagi de desencriptar, l’escrit li demana el missatge a desencriptar.

34
Figura 30. El programa demana el missatge a desxifrar.

Un cop escrit el missatge i premut enter, l’aplicació torna el missatge desencriptat i regresa
al menú inicial.

Figura 31. El sistema desxifra el missatge “jqnc/oqp” a


“hola/mon”.

En cas que el mode sigui tres, es tanca el programa.

35
4.3 DISSENY I EXECUCIÓ DEL PROGRAMA 2
Igual que amb el primer programa, abans de posar-se a codificar, es pensa el funcionament
de l’aplicació, així doncs el programa funciona pràcticament igual que l’altra tot i que,
mentres en la primera aplicació l’usuari ha d’introduir la clau amb la qual s’encripta i tot el
missatge s’encripta amb la mateixa clau, el segon programa té integrades les claus amb les
quals codifica i cada lletra es substitueix a partir d’una clau diferent. Es segueix encriptant
cada lletra amb el mètode de desplaçament per tant, tal com s’explica en el punt anterior,
per encriptar s’ha d’assignar un valor numèric a cada lletra i sumar-li el valor de la clau, el
resultat de la suma és el valor numèric que correspon a la lletra encriptada.
Evidentment, el codi dels dos programes serà molt igual. Es començarà a codificar amb les
llibreries, s’inclouran les mateixes llibreries que en el primer programa: “<iostream>”
“<conio.h>” “<stdio.h>” i “<cstring>”.
En segon lloc es comença a assignar un valor numèric a cada lletra de l’abecedari
començant per la lletra ‘a’ que té el valor u, després la lletra ‘b’ que té el valor dos fins la ‘z’
que té el valor vint-i-sis. El programa realitza els espais entre paraules amb una barra
ascendent ja que el codi no detecta espais i la terminal no deixa escriure missatges que
continguin només un espai. Així doncs, se li assigna el valor menys u a la barra ascendent.
Amb la funció de tipus “int”, nom “numerolletra” i paràmetre la variable de classe “char” amb
nom “lletra”, es convertiran totes les lletres en el seu número assignat. Aquesta funció es pot
realitzar gràcies al “switch” en funció de la variable “lletra” que hi ha dins la funció. Dins el
“switch” s’ha escrit tot l’abecedari, en cada cas de cada lletra es retorna el valor assignat.
Per la barra ascendent retorna el número menys u. A continuació s’ha declarat i definit la
funció que permet fer el contrari de la funció anterior, la funció de tipus “char”, amb nom
“lletranumero” i amb paràmetre la variable de categoria “int” amb nom “numero”, que
converteix els números en lletres. El programa pot realitzar aquesta acció gràcies, igual que
abans, al “switch” en funció de la variable “numero”. Per cada cas en què el programa obté
un número, retorna la seva lletra assignada. Per el valor menys u retorna la barra
ascendent.

Un cop es declaren i defineixen les funcions, es comença a codificar dintre de la funció


principal, la “int main()”. En primer lloc es defineixen les següents variables (la majoria són
les mateixes que en el primer codi): “int mode”, servirà per emmagatzemar l’operació que
vol fer l’usuari, encriptar, desencriptar o tancar el programa; “static const int CLAUS [ 20 ] = ”
en aquest cas es tracta del que segurament és la part més important del codi, aquesta
constant emmagatzema totes les claus amb les que s’encripta, en total vint (les claus són
22, 16, 23, 19, 5, 24, 10, 12, 8, 3, 25, 13, 4, 15, 11, 6, 20, 26, 21 i 14, es defineixen després
de l’igual entre claus) estan disposades en un índex en el qual la primera posició correspon

36
a la posició zero; “string missatge” és on s'emmagatzema el missatge que s’ha d’encriptar,
és escrit per l’usuari; “string missatge 2” és on es guarda el missatge que s’ha de
desencriptar, és escrit per l’usuari també; “string missatge_nou” és on s’emmagatzema el
missatge resultant de l’encriptació o desencriptació; “int aux” és on es guarda el valor de la
lletra que s’ha d’encriptar o desencriptar; “int a” amb valor zero, serveix com a índex de la
constant “CLAUS”, quan val zero, es codifica amb el primer valor de la constant.

En segon lloc, es crea un bucle “while” on sempre i quan “mode” no sigui igual a tres es
repeteixi el menú inicial. Al menú inicial s’hi pot seleccionar el mode segons es vol encriptar,
desencriptar o tancar el programa degut al comandament “std::cin >>” on el número u indica
que es vol encriptar, el dos que es vol desencriptar i el tres que es vol tancar el programa, el
valor que indica l’usuari es guarda a “mode”. Seguidament es dona el valor d’un espai a
“missatge_nou” per tal que després es s’ompli lletra per lletra.

Quan el mode val u s’ha de començar amb el procés d’encriptament, així doncs, es
necessita un “if” amb la condició que “mode” sigui igual a u. Quan aquesta condició es
compleix el programa demana a l’usuari el missatge encriptar i, a través del comandament
“std::cin >>” es guarda el missatge a la variable “missatge”. Seguidament es comença el
procés d’encriptament, es crea un bucle “for” amb variable de tipus “int”, nom ‘i’ i valor zero
que augmenti u cada cop que es compleixi el codi de dins del bucle fins un límit, que és la
llargada del missatge, s’utilitza el comandament “missatge.length()”. Es crea el bucle “for”
per poder analitzar independentment totes les lletres. Si la lletra del missatge que s’analitza
no és un espai, aleshores es començarà l’encriptació, aquest pas es realitza amb un “if” i la
condició que la lletra que es troba en la posició del mateix valor que té ‘i’ no sigui igual a un
espai. Seguidament es dona el valor a la variable “aux”, aquest valor és igual a la funció
“numerolletra” amb paràmetre la lletra de “missatge” que respon a l’índex de valor ‘i’.
En cas que “aux” sigui igual a menys u, és a dir, el valor que correspon a la barra
ascendent, es suma al missatge resultant la barra ascendent. Així doncs es crea un altre “if”
amb condició “aux == -1” que si es compleix a “missatge_nou” se li suma el resultat de la
funció “lletranumero” amb argument menys u, aquesta funció converteix el menys u en la
barra.
En cas que la suma del valor de la lletra que s’ha d’encriptar amb la clau corresponent sigui
menor o igual a vint-i-sis, es sumarà al missatge encriptat la lletra que li correspon el valor
de la suma. En conseqüència, es crea un altre condicionant, un “else if” que tingui com a
condició “aux + CLAUS [ a ]”, com que “CLAUS” és una constant, hi afegim l’índex [a], que
localitza la clau segons el seu valor. Dins de la condició sumem a “misatge_nou” la lletra
que correspon a través de la funció “lletranumero” amb argument la suma “aux + CLAUS[ a

37
]”. Com que volem que per cada lletra la clau sigui diferent, augmentem u el valor de ‘a’,
això farà que la següent encriptació es xifri amb la següent clau en l’ordre de la definició. Al
tenir vint valors, quan volem encriptar missatges amb més de vint caràcters, les claus han
de tornar a començar, per això, si ‘a’ és major que dinou (ja que la primera posició
correspon al valor zero, no a l’u), el seu valor torna a zero.
Si la suma del valor de la lletra més la clau és més gran que vint-i-sis, el valor obtingut no
respon a cap lletra així que s’ha de restar vint-i-sis al resultat de la suma per tal de tornar a
començar l’abecedari. Per realitzar aquesta funció, es crea un altre condicionant “else if”
amb condició que la suma “aux + CLAUS[ a ]” sigui major que vint-i-sis. A “missatge_nou” se
li suma el caràcter que doni la funció “lletranumero” amb argument el resultat de la suma
menys vint-i-sis. Seguidament s’augmenta u la variable ‘a’ i si és major que dinou adquireix
el valor zero.
Per finalitzar, s’imprimeix el missatge resultant i es torna el valor zero a ‘a’.

Si el mode és dos, el programa ha de desencriptar el missatge. Així doncs, primer demana


el missatge a desencriptar i el guarda a la variable “missatge2”.
Es crea un altre bucle “for” amb una altra variable “int” amb nom ‘x’ de valor zero, el límit de
‘x’ també serà la llargada de “missatge2” que es trobarà amb “missatge2.lenght()”, finalment
‘x’ augmentarà u cada cop que es completi el codi de dins del bucle.

Si el caràcter que correspon a la posició de valor ‘x’ de “missatge2” no és igual a un espai,


aleshores comença la desencriptació. Es torna a igualar “aux” al valor de la lletra que
s’analitza a través de la funció “numerolletra” amb argument la lletra que ocupa la posició ‘x’
de “missatge2” o el que és el mateix, “missatge2[ x ]”.
A partir d’aquí el codi és exactament igual que en la codificació però canviant les sumes de
“aux” més “CLAUS [ a ]” amb restes de “aux” menys “CLAUS [ a ]” , ja que volem retornar a
la lletra original i si, inicialment li hem sumat un valor, ara li hem de restar. També s’ha de
canviar els signes de més gran i més petit i el vint-i-sis per el zero dins de les condicions .
Així doncs si “aux” és igual a menys u, com sempre, a “missatge_nou” se li ha de sumar la
funció “lletranumero” amb argument menys u, el resultat és la barra ascendent que permet
separar les paraules.
Si la resta de “aux” menys la clau és major que zero, a “missatge_nou” se li suma la lletra
que correspon al valor resultant de la resta a través de la funció “lletranumero”, que
converteix el resultat de la resta en la lletra corresponent, amb argument la resta
expressada. Aleshores se li suma u a la variable ‘a’ i si aquesta és major que dinou, retorna
a zero.

38
En cas que la resta “aux - CLAUS[ a ] sigui menor o igual a zero, el resultat no
correspondria a cap lletra, així doncs s’ha de sumar vint-i-sis per retornar als valors que sí
que tenen assignat una lletra. La lletra que respon el resultat de l’operació es suma a
“missatge_nou”, l’acció de convertir el resultat de l’operació en la lletra que pertoca també la
realitza la funció “lletranumero” amb argument l’operació “(aux - CLAUS [ a ]) + 26”.
Seguidament es suma u a la variable ‘a’ i si és major que dinou, ‘a’ s’iguala a zero.
Per últim s’imprimeix “missatge_nou” i s’iguala ‘a’ a zero.
En cas que el mode sigui tres, el programa es tanca.
Es pot observar el codi a través de la web:
https://github.com/oleguer8/encriptamentmillorat/blob/main/xifratgemillorat.cpp

Un cop conegut el codi del programa, s’observarà l’execució d’aquest des de punt de vista
de l’usuari que l’utilitza.
Quan s’executa, apareix el menú inicial, on es demana a l’usuari si vol encriptar,
desencriptar o tancar el programa.

Figura 32. Menú segon programa. Demana el mode que es vol


utilitzar, encriptar, desencriptar o tancar el programa.

Si es tria la primera opció, prement la tecla 1 seguit d’intro, apareix un escrit on demana el
missatge a encriptar i avisa que només es faci servir minúscules i que per als espais s’utilitzi
la barra ascendent.

Figura 33. El programa demana el missatge a encriptar amb un avís del que accepta i no accepta el programa,
només accepta minúscules i no accepta espais, per separar cal utilitzar una barra ascendent.

39
Un cop escrit el missatge i premut intro, el programa ens ofereix el missatge encriptat i torna
al menú inicial.

Figura 34. El resultat de l’encriptament de “hola/món” és “deit/rmx”. Després d’imprimir el resultat, el programa
torna al menú inicial.

Si es tria la segona opció, prement la tecla 2 seguit d’intro, apareix un escrit on demana el
missatge a desencriptar i avisa que només es faci servir minúscules i que per als espais
s’utilitzi la barra ascendent.

Figura 35. El programa demana el missatge a desencriptar amb un avís del que accepta i no accepta el sistema,
només accepta minúscules i no accepta espais, per separar cal utilitzar una barra ascendent.

Quan ja s’ha escrit el missatge a desencriptar i s’ha premut intro, l’aplicació torna el missatge
desencriptat i regresa al menú inicial.

40
Figura 36. El programa ha desencriptat el missatge “deit/rmx” en “hola/mon” i ha regressat al menú inicial.

41
5. COMPARACIÓ DELS DOS PROGRAMES
Els dos programes són completament funcionals, a continuació es realitzarà la comparació
dels dos programes per observar quin dels dos és més segur.
5.1 DIFERÈNCIES ENTRE ELS PROGRAMES
Els programes tenen moltes semblances entre si, es podria dir que el segon programa actua
igual que el primer amb una modificació. A vista de l’usuari la diferència és en que el primer
programa necessita que se li doni una clau per poder encriptar i desencriptar els missatges
mentres que el segon programa no ho demana. (vegeu figura 27, figura 33 i figura 35).
En el codi es poden observar més diferències. La primera es pot veure en què en el codi
del programa que demana la clau a l’usuari, es declara una variable de tipus “int” amb el
nom “clau”, que se li assigna valor quan l’insereix l’usuari.
int clau;
std::cout << "Escriu la clau: ";
std::cin >> clau;

En el codi del programa que té assignades les claus, en comptes de declarar una variable
normal, es declara una constant de tipus “int” amb el nom “CLAUS” que té vint valors i cada
un està té assignat un altre valor com a índex, l’índex del primer nombre és el zero, i el de
l’últim és el dinou, així que si volem utlitzar el catorze hem d’escriure “CLAUS [ 19 ]”.
static const int CLAUS[20] = { 22, 16, 23, 19, 5, 24, 10, 12, 8, 3, 25,
13, 4, 15, 11, 6, 20, 26, 21, 14 };

Relacionat amb l’índex, en aquest codi, a diferència del primer programa, es declara una
variable ‘a’ que actuarà com a índex i, cada vegada que s’encripti una lletra, se li sumarà u
al seu valor per el que la pròxima lletra s’encriptarà amb la següent clau de la llista.
else if( (aux + CLAUS[a]) <= 26 ){
missatge_nou += lletranumero(aux + CLAUS[a]);
a++;
if (a > 19){
a = 0;}

L’estructura de fer la suma, o resta en cas que es desencripti, de “aux” i “CLAUS” en funció
de ‘a’ juntament amb ‘a++’ que fa que es sumi u, i la condició que si la variable és supera
dinou, torni al zero es repetirà sempre que s’encripta i desencripta una lletra.
Per contra, en el primer programa, el codi no necessita una variable ‘a’ ni la variable “clau”
depèn de cap altra variable.
else if( (aux + clau) <= 26 ){
missatge_nou += lletranumero(aux + clau);}

42
5.2 SEGURETAT DELS DOS PROGRAMES
Per concloure quin dels dos programes és millor o més bo, únicament es considerarà la
seguretat que aporten els dos programes ja que, en un programa d’encriptament i
desencriptament el que interessa és que sigui segur i difícil de desxifrar per una persona
externa que no tingui accés al programa.
S’entendrà com a seguretat del programa que quan encripta un missatge sigui dificultós
trobar la clau per desencriptar-lo sense tenir accés al programa.
Per desxifrar un missatge encriptat pel primer programa es pot fer un anàlisi de freqüència,
que tal com s’ha explicat en el punt 3.2, es tracta d’observar quines són les lletres que més
es repeteixen en el missatge i, d’acord amb l’idioma que es cregui que està escrit el
missatge, descartar la possibilitat que la lletra repetida es tracti d’un dels caràcters que
menys s’utilitzen en l’idioma, eliminant així molts dels possibles caràcters. Així doncs, no és
molt complicat desxifrar un missatge. L’avantatge de que l’usuari pugui triar la clau i es
substitueixi tot el missatge amb la mateixa clau és que el receptor del missatge, no
necessita tenir accés al programa, sabent la clau podria desxifrar el missatge fàcilment a
mà.
Per contra, per desxifrar un missatge encriptat pel segon programa no es pot fer un anàlisi
de freqüència tan fàcilment ja que cada lletra s’encripta amb una clau diferent. En el cas que
s’encriptés un missatge molt llarg sí que es pot arribar a observar una periodicitat en les
claus i, tot i així, és molt difícil de veure i el missatge ha de ser molt llarg. Si el programa
tingués menys claus integrades seria més senzill de trobar la periodicitat i si tingués més
claus seria encara més complicat de trobar, vint és un valor que és difícil de trobar la
periodicitat. Al contrari que amb el primer programa, el receptor del missatge encriptat
necessita el mateix programa perquè al no saber les claus amb les que es substitueix cada
lletra, no podria desencriptar el missatge o hauria de fer un anàlisi de freqüència de la
periodicitat de les claus, fet que li costaria molt de temps si no és que és impossible perquè
no hi ha periodicitat.
Així doncs, es pot afirmar que el programa que té incloses les claus en el codi i que
substitueix cada lletra per una clau diferent és més segur que el programa que demana la
clau a l’usuari. No obstant, tan l’emissor com el receptor necessiten tenir el programa per
encriptar i desencriptar el missatge.

43
6. CONCLUSIONS
Els objectius principals del present treball de recerca que es van proposar a l’inici del treball
van ser, per una part, el de crear un programa informàtic capaç d’encriptar i desencriptar
missatges a partir de la inserció d’una clau per part de l’usuari. Per l’altra part realitzar una
recerca d’informació amb la qual es pogués veure l’evolució dels sistemes i instruments
d’encriptament al llarg de la història. A mesura que el temps passava, els objectius
principals també van canviar, per una banda, crear dos programes informàtics capaços
d’encriptar i desencriptar missatges. Un a partir d’una clau donada per l’usuari del programa
i l’altra a partir d’unes claus que té el propi programa i que per cada caràcter s’encripti amb
una clau diferent. Per l’altra banda, l’objectiu continuava sent el mateix, realitzar una recerca
d’informació amb la qual es pogués veure l’evolució dels sistemes i instruments
d’encriptament al llarg de la història però centrant-se sobretot amb la història i el
funcionament d’una de les màquines de codificació i descodificació de missatges més
famosa i transcendent de la història: la màquina “Enigma”. Per últim, es va afegir un últim
objectiu, el de comparar els dos programes i determinar quin dels dos és el més segur.

Primerament, amb la part de recerca d’informació, s’ha aconseguit que s’entengués el


funcionament de tots els mètodes utilitzats des de l’Edat Antiga, juntament amb tots els
instruments i màquines que ajudaven a realitzar tan l’encriptament com el desencriptament
de missatges i les altres tècniques que no tracten d’encriptar un missatge sinó d’amagar-lo,
l’esteganografia. Amb la recerca d’informació s’ha assolit que s’entengués el funcionament
de la màquina “Enigma”, la màquina amb la que els nazis encriptaven els missatges durant
la Segona Guerra Mundial. Altrament, s’ha parlat sobre els usos dels missatges encriptats
avui en dia, explicant el sistema de seguretat de WhatsApp i el paper important que va tenir
l’esteganografia en un atemptat terrorista. A través de tota la informació s’ha pogut deduir
que els mètodes d’encriptament inicialment eren sobretot a través de la raó, sense
necessitat de cap instrument o màquina per dur-lo a terme, i amb els avenços de la societat
els mètodes han anat mecanitzant-se fins avui en dia, que les màquines codifiquen
missatges sense que nosaltres ens n’enterem.

En segon lloc, amb la part més pràctica del treball, s’ha aconseguit l’objectiu de crear dos
programes informàtics capaços d’encriptar i de desencriptar missatges. En aquest apartat,
s’ha assolit unes nocions molt bàsiques del llenguatge de programació utilitzat, el C++ (C
plus plus). Tanmateix, s’ha aconseguit entendre el funcionament dels dos programes, tan
del que necessita que se li inserti una clau com del que ja les té integrades. Finalment, s’ha
raonat quin dels dos programes és el més segur i per què ho és.

44

You might also like