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: |
> |