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: