Gianni Giaccaglini

Tricks & mini applics on WPF
posts - 46, comments - 0, trackbacks - 0

Crittografia di un testo con Excel + VBA

 Criptare/decriptare un testo usando Excel + VBA

Premessa teorica. Dal dibattito sui procedimenti di cifratura/decifratura o, come qui mi esprimerò, di criptazione/decriptazione di un testo alla fine è scaturito questo caposaldo: soltanto una chiave di lunghezza uguale a quella del testo garantisce totale segretezza

Convinto che questa meta sia molto ardua da conseguire (specie se a livello di un amatore per quanto creativo) ritengo tuttavia che si possa raggiungere un ragionevole compromesso, adottando per giunta criteri particolari non del tutto standard (anche se non s’inventa nulla a questo m ondo…).

 

Veniamo al dunque mostrando subito la parte sinistra del modello Excel, posta a partire dalla cella A1.

NOTA. Le evidenziazioni come sfondi e sottolineatura sono servite a mostrare che il codice macro agisce esclusivamente sui valori, lasciando immutate e formattazioni.

Brani originali

Shift1

Shift2

Shift3

Shift4

Brani criptati

Nel deserto dell'Africa

4

3

3

2

dfmtiD+nohh"rwvgvhh"ohR

un leone, che j'era entrato n’ago

2

4

1

4

pxcvurg$bvg+k$gld$.iosgp!rw

chiamò un tenente.

5

4

1

3

2jwoishu$sx!ördjlh

"Grazie! - je disse doppo - .

5

4

2

5

3%/$tursi%gwxnf$jo"1%&gmftK'

de avemme libberato.

5

1

5

2

0tuftjcgkq!jorf{c%fi

Vedrai sarò ariconoscente.

3

4

1

3

2hwoifvprrfjvd#óvdv!mdueiY

Che voi? Esse promosso?

3

2

4

4

Cqvwsorvt"hwwG#Cmqy$ijF

Embè...te darò na mano."

2

2

5

5

'3qpfr"cs%ôtfi"gy300ígoG

E quella sera stessa

3

5

5

2

cxxhvx%dtjx#cqqhwv%H

mantenne la promessa.

4

5

2

3

2duxipqwt#cq$hpsiwpfq

Andò dar tenente: "Amico,

1

5

4

1

-pgnnB&%;fxsfoiy!sei!óhsB

 la promozione è certa;

3

1

1

4

$<bwvfd#ì!fqsj{rqpss$bm#

ho magnato er capitano."

2

1

2

2

$0ppcvjrce!tg"pvcphco"pj

CIFRE E SEGNI SPECIALI:

2

5

5

3

?NNDNHGSX%KQLJU#J%GUKNE

    12*3^3 >= 4àéè§[]%& y=(1+0,25x)

2

1

1

4

*y76-1-5)>{$'&__¨éëä5!?B!4`7+33

 

Sulla prima colonna si ha una serie di brani originari, affiancata dalla colonna dei vari scorrimenti  (Shift) da applicare ad essi, in modo ciclico. Facciamo un esempio, partendo dal primo brano (Nel deserto…). Ai vari caratteri si applicano gli shift posti fra parentesi, che si susseguono con 4, 3, 3, 2 poi di nuovo 4, 3, ecc.

N (4) => R; e(3) =>h;  l(3) => o spazio(2) => "; d(4) =>h; e(3) =>h ... e via di seguito, ottenendo Rho”hh...

N.B. Il fatto di aver spezzato un testo in brani di lunghezza limitata dovrebbe far sì che quattro scorrimenti bastino a fornire una ragionevole sicurezza contro curiosi e spie, umani o softwaristici. A ciò ho aggiunto due particolarità:

1) Gli shift vengono di volta in volta creati mediante numeri  casuali.

2) Nella criptazione, come nell’opposta operazione decriptante, è stata usata la funzione VBA StrReverse (Testo) che rovescia un Testo, tramutando ad esempio Roma in amoR.

NOTA. Si riveda il caso del primo brano (Nel deserto…). Sopra avevamo visto che la criptazione lo traduce in Rho”hh... Qualcuno si sarà stupito di non aver trovato questa sequenza nella terza colonna. Ma rileggendola all’incontrario il mistero si chiarisce, alla luce dell’osservazione 2.

Sulla colonna subito a destra (non riportata sopra per motivi editoriali) si ha la situazione identica all’originale, com’era da attendersi.

Brani decriptati

Nel deserto dell'Africa

un leone, che j'era entrato

chiamò un tenente.

"Grazie! - je disse doppo - .

de avemme libberato.

Vedrai sarò ariconoscente.

Che voi? Esse promosso?

Embè...te darò na mano."

E quella sera stessa

mantenne la promessa.

Andò dar tenente: "Amico,

 la promozione è certa;

ho magnato er capitano."

CIFRE E SEGNI SPECIALI:

12*3^3 >= 4àéè§[]%& y=(1+0,25x)

 

N.B. I risultati della prima e della quarta colonna derivano da due funzioni personali dal nome promettente TestoCript e TestoDecript entrambe dotate di argomenti Testo, Sh1, Sh2, Sh3 ed Sh4. Altro non sono che i succitati scorrimenti, alias Shift.

Prima di esaminarle indichiamone l’impiego, ponendo sulla sinistra l’intervallo cui ciascuna è applicata:

F2:F16=TestoCript(A2;B2;C2;D2;E2) 
G2:G16=TestoDecript(F2;B2;C2;D2;E2)

Ai buoni intenditori che hanno seguito questi discorsi non servono altre ciance.

Il codice criptante

Si trova nel Modulo1, insieme alla macro che prepara gli scorrimenti (pseudo) casuali:

Dim ZonaShift As Range ' Variabile a livello Modulo

Sub CaricaShift()
  Dim NumRighe As Integer
  With Range("A2")
    NumRighe = Range(.Cells(1), .End(xlDown)).Rows.Count
  End With
  Set ZonaShift = Range(Range("B2"), Cells(NumRighe + 1, 5))
  Dim Cella As Range
  For Each Cella In ZonaShift
    Cella = Int(Rnd * 5 + 1)
  Next
End Sub

Function TestoCript(ByVal Testo As String, Sh1 As Integer, Sh2 As Integer, Sh3 As Integer, Sh4 As Integer) As String
  Dim VettShift(1 To 4) As Integer
  Dim i As Integer, j As Integer
  ' Carica scorrimenti nella matrice VettShift
  VettShift(1) = Sh1
  VettShift(2) = Sh2
  VettShift(3) = Sh3
  VettShift(4) = Sh4
  Dim NuovoTesto As String, Car As String
  j = 1
  For i = 1 To Len(Testo)
    Car = _
    Chr(Asc(Mid(Testo, i, 1)) + VettShift(j))
    j = IIf(j = 4, 1, j + 1)
    NuovoTesto = NuovoTesto & Car
  Next
  TestoCript = StrReverse(NuovoTesto)
End Function

Sub ProvaTestoCript()
  MsgBox TestoCript("Amba123;?", 1, 2, 3, 4)
End Sub

È importante sottolineare che l’istruzione
TestoCript = StrReverse(NuovoTesto)

è presente all’uscita della Function, il cui risultato deriva dalla successione cripta poi rovescia. Come conviene anticipare ed è logico attendersi, l’imminente funzione di decriptazione compie le due operazioni in senso contrario.

Il codice de-criptante

Si trova nel Modulo2.  È riportato qui di seguito, a questo punto affidando commenti dettagliati all’esegesi-self di quanti hanno compreso  il codice precedente, di cui questo è stretto parente.

Function TestoDecript(ByVal Testo As String, Sh1 As Integer, Sh2 As Integer, Sh3 As Integer, Sh4 As Integer) As String
Dim VettShift(1 To 4) As Integer
  Dim i As Integer, j As Integer
  ' Carica Shift in VettShift, con segno opposto
  VettShift(1) = -Sh1
  VettShift(2) = -Sh2
  VettShift(3) = -Sh3
  VettShift(4) = -Sh4
  Dim NuovoTesto As String, Car As String
  j = 1
  Testo = StrReverse(Testo)
  For i = 1 To Len(Testo)
    Car = _
    Chr(Asc(Mid(Testo, i, 1)) + VettShift(j))
    j = IIf(j = 4, 1, j + 1)
    NuovoTesto = NuovoTesto & Car
  Next
  TestoDecript = NuovoTesto
End Function

Come testé anticipato, è necessario e sufficiente far notare che l’istruzione
Testo = StrReverse(Testo)

In questo caso precede il ciclo For ...  Next di decriptazione.

Come usare il modello

Il suo scopo primario era quello di offrire una palestra per comprendere certi principi. L’applicazione pratica, nel caso di un dialogo con un collega fidato potrebbe procedere con i passaggi seguenti.

1. Tradurre le formule dei brani criptati in valori.

2. Copiare tutte le colonne del modello esclusa la prima.

3. Incollare tale materiale in un nuovo spreadsheet, per salvarlo e spedirlo al partner.

Mi è mancata la voglia e il tempo di automatizzare tali operazioni. Comunque agl’interessati suggerisco questo codice che svolge il primo mestiere. Corrisponde a un utilizzo manuale per abilissimi: 1) copiare l’intervallo; 2) spostarlo un pochino col clic destro senza lasciare la presa; 3) riportalo nella posizione di partenza; 4) scegliere Copia qui come valori.

Range("F2:F16").Copy
Range("F2:F16").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

NOTA.  I più diffidenti potrebbero occultare le colonnine degli shift, magari con larghezza minima e caratteri bianchi, e soprattutto proteggendone l’accesso con mosse che do per note e passward nota al nostro amico.

Senza l’operazione predetta il neonato foglio di lavoro si presenta con l’angosciante ma non imprevista domanda sull’estrema colonna.

Shift1

Shift2

Shift3

Shift4

Brani criptati

Brani decriptati

4

3

3

2

gqrin#qy"dfmtiD+nohh"rwvgvhh"ohR

#NOME?

2

4

1

4

ieikt!vc$pvvrfh"she"rv$qxbvvrf$cvf+l$fle

#NOME?

5

4

1

3

1frtl{~fuftt*m$whq$jwoishu$sx!ördjlh

#NOME?

5

4

2

5

3tk~ftksnte,y"sn%/$tursi%gwxnf$jo"1%&gmftK'

#NOME?

5

1

5

2

qn{cwux",pyu%bi"tuftjcgkq!jorf{c%fi

#NOME?

3

4

1

3

1hurhftsqrdmud!öudt$hw!ikf!mdueiY

#NOME?

3

2

4

4

Csuvsqqut$gvwi)G$Cqxx$quimuqit"ui$ê#pewT

#NOME?

2

2

5

5

'0qsfo"fs"ôwff"jy".txuqu%qk,x".ígoG

#NOME?

3

5

5

2

cxxhvx%dtjx#cqqhwv%H"3twvfk#pz%h"tywgi%qw%zI

#NOME?

4

5

2

3

rpfmwunvf"sy*f%smgr$üku$duxipqwt#cq$hpsiwpfq

#NOME?

1

5

4

1

0tdjqF#!>jttmi!f$juoisfu$wbe$jefrlB

#NOME?

3

1

1

4

#sdjg$pm#iu!h$-bwvfd#ì!fqsj{rqpss$bm#

#NOME?

2

1

2

2

#0qpbvkrbe"tf"qvbpicn"qu!go"êjetfr

#NOME?

2

5

5

3

<LQFKFJUU#NSIHX%G#JWHLH%PRH%CYTWR

#NOME?

2

1

1

4

*z.63.4!,"5)>{$'&__¨éëä""qspO"C55"A?!57!4`7+33

#NOME?

 

A questo punto non resta altro da fare:

3. Spedire al partner il Modulo2, che costituisce la vera chiave decriptante!

Costui potrà semplicemente importarla vedendo così risuscitare i brani originali al posto dei vari angoscianti #NOME?.

Ricordo in fine che la cosa funziona anche con un formato .xlsx (ovviamente la fatidica funzione si perde al salvataggio, ma se rispondiamo giusto alla segnalazione di Excel possiamo sempre imporre il formato .xlsm.

Print | posted on venerdì 27 febbraio 2015 14:50 |

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 7 and 6 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET