c SISTEMA DI CODIFICA E DECODIFICA DI UNA RIGA c c Il sistema presuppone un codice di gruppo h fisso c c Definizioni character*1 riga(80),rigad(80) c riga e rigad contengono la riga originale e la riga c decodificata (che dovrà risultare uguale alla prima) character*1 c,d equivalence (m,c) equivalence (md,d) c c è il generico carattere della riga originale; c d è il generico carattere della riga decodificata; c m è il messaggio singolo da codificare; c md è il messaggio singolo decodificato. integer rigac(400) c rigac è la riga codificata: c 80 caratteri si trasformano in 400 cifre c c Lettura riga write(6,60) 60 format(' Scrivere il messaggio: al max 80 caratteri') read (5,1) (riga(k),k=1,80) 1 format(80a1) c Lettura chiave pubblica write(6,61) 61 format(' Scrivere la chiave pubblica') read(5,*) n c Assegnazione codice di gruppo h=46337 c c Codifica della riga c c Estrazione dei caratteri della riga do 10 i=1,80 c=riga(i) c Compensazione degli spazi mm=m+i c Codifica di un singolo carattere call codifica(mm,mc,n) c Costruzione riga codificata k1=5*(i-1)+1 numero1=mod(mc,10) rigac(k1)=numero1 k2=5*(i-1)+2 numero2=mod(mc,100)/10 rigac(k2)=numero2 k3=5*(i-1)+3 numero3=mod(mc,1000)/100 rigac(k3)=numero3 k4=5*(i-1)+4 numero4=mod(mc,10000)/1000 rigac(k4)=numero4 k5=5*(i-1)+5 numero5=mc/10000 rigac(k5)=numero5 10 continue write(6,63) 63 format(' Riga codificata') write(6,3)(rigac(k),k=1,400) 3 format(1x,400i1) pause A questo punto si suppone che il messaggio codificato venga inviato al destinatario il quale, utilizzando la propria chiave privata, provvederà a decodificarlo. c c Decodifica della riga c write(6,51) 51 format(' Scrivere la chiave privata') read(5,*) j do 20 k=1,400,5 m=rigac(k+4)*10000+rigac(k+3)*1000+rigac(k+2)*100+ *rigac(k+1)*10+rigac(k) mmm=m call decodifica (mmm,md,n,j) ii=k/5+1 md=md-ii rigad(ii)=d 20 continue write(6,64) 64 format(' Riga decodificata') write(6,4)(rigad(ii),ii=1,80) 4 format(1x,80a1) stop end Programmi ausiliari c c Procedimento di codifica c Subroutine codifica (m,mc,n) c c m è il messaggio da codificare; c n è la chiave pubblica c mc è il messaggio codificato c c Definizioni c integer i(30),h,a,r c h è il codice di gruppo h=46337 call estraz(i,h) a=m**i(1) a=mod(a,n) do 10 r=2,30 m=mod(m*m,n) a=a*m**i(r) a=mod(a,n) 10 continue mc=a return end c c Procedimento di decodifica c subroutine decodifica (m,md,n,j) c c m è il messaggio da decodificare c md è il messaggio decodificato c j è la chiave privata c n è la chiave pubblica c c Definizioni c integer i(30),a,r jj=j call estraz(i,jj) a=m**i(1) a=mod(a,n) do 10 r=2,30 m=mod(m*m,n) a=a*m**i(r) a=mod(a,n) 10 continue md=a return end c c Trasformazione di un intero in stringa binaria c subroutine estraz(bit,intero) integer bit(30) do 5 i=1,30 5 bit(i)=0 do 10 i=1,30 n=intero intero=rshift(intero,1) m=lshift(intero,1) bit(i)=n-m 10 continue return end 1