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