Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- link random
- procedure main()
- local u,crp
- u:=read()
- crp:=read()
- write(encode(u,crp))
- end
- #кодирование строки шифром Вернама
- procedure encode(u,keys)
- local l,i,s,v,key,g,t
- t:=" !~`@#$%^&*(),.<>/?|\{}[]-+=_:;№"
- s:=&letters++&digits++t
- l:=list()
- v:=list()
- key:=keys
- if key=="" then key:=gen_pass(*u)
- until (*key)>=(*u) do {
- key||:=key
- }
- every put(l,to_bin(find(!u,s)))
- every put(v,to_bin(find(!key,s)))
- g:=xor_list(l,v)
- return index_from(g,s)
- end
- #перевод в двоичную систему
- procedure to_bin(x)
- local r,s,n
- n:=x
- s:=""
- while n>=1 do {
- r:=n%2
- s:=s||r
- n:=integer(n/2)
- }
- s:=reverse(s)
- while *s~=8 do {
- s:="0"||s
- }
- return string(s)
- end
- #исключающее "или" для двух списков
- procedure xor_list(l1,l2)
- local a,b,i,j,c,d,n,m
- n:=list()
- every i:=1 to *l1 do {
- c:=l1[i]
- d:=l2[i]
- m:=""
- every j:=1 to *c do {
- m:=m||ixor(c[j],d[j])
- }
- put(n,m)
- }
- return n
- end
- #перевод из двоичной системы в десятичную
- procedure to_dec(d)
- local b,i,v
- b:=0
- v:=reverse(d)
- every i:=1 to *d do {
- b:=b+((2^(i-1))*v[i])
- }
- return b
- end
- #генерация шифротекста
- procedure index_from(g,s)
- local i,v,n
- v:=""
- every i:=1 to *g do {
- n:=to_dec(g[i])
- v:=v||s[n]
- }
- return v
- end
- #генерация "хорошего пароля" из n знаков
- procedure gen_pass(n)
- local s,i,a
- a:=""
- s:=&letters++&digits
- randomize()
- every i:=1 to n do {
- a:=a||s[?(*s)]
- }
- return a
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement