TEORIA DOS NÚMEROS E CRIPTOGRAFIA - 2003/04

...UM POUCO DE CRIPTOLOGIA...

Conversão de letras em números e vice-versa:

>  convert("a",bytes);
convert("a",bytes)[1];
convert("z",bytes)[1]-97;
convert([97+20],bytes);
convert(" ",bytes);
> 

Concatenação de "strings":

>  cat("b876","x?=656");
> 

Cálculo do número de letras de uma palavra:

>  K:="pois": m:=nops(convert(K,bytes));
K[4];
> 

Algoritmo que encripta uma mensagem usando a cifra de Vigenère:

>  K:="pois": m:=nops(convert(K,bytes)):
M:="elesnaosabemnemsonhamqueosonhoeumaconstantedavidataoconcretaedefinidacomooutracoisaqualquer":
C:="":
for i from 1 while evalb(M[i]<>"") do
 j:=i mod m: 
  if j=0 then j:=m:fi:
c:=convert(M[i],bytes)[1]+convert(K[j],bytes)[1]-2*97 mod 26 +97: #...97->minusculas;65->maiusculas
 C:=cat(C,convert([c],bytes)): 
od:
printf("%A",C);
> 

Algoritmo de decifraçãoo de uma mensagem encriptada com a cifra de Vigenère:

>  K:="pois": m:=nops(convert(K,bytes)):
M:=C: Dc:="":
for i from 1 while evalb(M[i]<>"") do
 j:=i mod m: 
  if j=0 then j:=m:fi:
c:=convert(M[i],bytes)[1]-convert(K[j],bytes)[1] mod 26 +97: #...97->minusculas;65->maiusculas
 Dc:=cat(Dc,convert([c],bytes)): 
od:
printf("%A",Dc);
> 

*******************************************************************************

Algoritmo de encriptação usando a cifra de substituição:

>  with(combinat,randperm):
>  pm:=randperm(26);
> 
>  M:="amorefogoqueardesemsevereferidaquedoienaosesenteeumcontentamentodescontenteedorquedesatinasemdoereumnaoquerermaisquebemquereresolitarioandarporentregenteenuncacontentarsedecontenteecuidarqueseganhaemseperderequererestarpresoporvontadeeserviraquemvenceovencedoretercomquemnosmatalealdademascomocausarpodeseufavornoscoracoeshumanosamizadesetaocontrarioasieomesmoamor":
> 
>  C:="":
for i from 1 to m do
 c:=convert(M[i],bytes)[1]-97+1: c:=pm[c]+96: 
 C:=cat(C,convert([c],bytes)):
od:
printf("%A",C):
> 

Um exercício -- decifrar a seguinte mensagem:

>  C:="eutphqobpdupoduixiuwiniebqutnqoptpxioqilqtlfelqqunifnxispnihplfohprixutlpnsioqlqtqopkfnitsqxeqwptpqftfsqutpouypinihplqlbqyixlqtwqfnxfnlqnsitutcupxwplbuypniutkfecufebqwisfesplpfxeutkiwplfebqpruowqkpkioeutfenspesiftpcfequtpofewpcpfyqsppyqpxeqliuypfyqpewqlqesqxepewqpftienpluxypeqxsinuoyqulqtiopyfpapewqbpypfkiduftfenspevuokfesqutvpxlqpyiopvxpelqepyicpewqispesqliuitpxeutvifaqpruoiesxipneuyienyitnuxcfewqutofewqpyfpqxqnpicxiepsuwqityqosplqoqxfewqlqtnupnourinpkfnlpxvpnspftpcfepxiioiinspkpxsfewqnixieqiofewqinipciesidufnixioiypfkqunpxeutphqobpdupoduixiuwiniebqutepyfqwikpxsfwplqtpocuenvqenptfcqnviviewqwivitlqtpyfwpwiutptixflppqusxpiulqenfcqkpnnpxeutnicuewqcfxqutnftkoinlqtkpnnqieutlfxluoqiuhplquttuewquttiefeqlptfebpilptfebpewqlbicpeqtuxqipofoqcqithxiesipinkixpxkiopciesiqhusuxqinspiqhusuxqiutppnsxqepyiduisiesptqnkfoqspxepqsitsitkqeitkfiwpwieitbqxpwilbicpxnitkiwfxoflielptuwpeqnnpyfwpiwikqfnlqtyfwpquplbqxpxeinnpinsxpwpepqeqnlpvilqebilixquyixqduiyfxpqhftwiopefecuitnpvipqlixsqqewiypfwpxyptqnsqwqnauesqneutpkpnnpxiopwiutppcupxiopduiutwfpiehftwinlqoqxfxp":
> 

Estudo da frequência das letras:

>  m:=nops(convert(C,bytes)):
for j from 0 to 25 do:
c:=0:
for i from 1 to m do:
 if C[i]=convert([97+j],bytes) then c:=c+1:fi:
od:
printf("(%A) %A\n",convert([97+j],bytes),evalf(c/m)*100): 
od:
> 

Estudo de digramas da forma -x e x- :

>  for j from 0 to 25 do:
c:=0: d:=0:
for i from 1 to m do:
 if C[i]="i" then
  if C[i+1]=convert([97+j],bytes) then c:=c+1:fi:
  if i<>0 then if C[i-1]=convert([97+j],bytes) then d:=d+1:fi:
fi: fi:
od:
printf("(%A) %A ; %A\n",convert([97+j],bytes),evalf(c/m)*100, evalf(d/m)*100): 
od:
>