116 lines
2.6 KiB
Text
116 lines
2.6 KiB
Text
Module CheckADFGVX_Cipher {
|
|
Class cipher {
|
|
Private:
|
|
buffer a as byte*36
|
|
b="ADFGVX"
|
|
key="ABCDEFGHIJK"
|
|
orderkey="ABCDEFGHIJK"
|
|
map=list
|
|
map2=list
|
|
module preparemaps {
|
|
for i=0 to 5
|
|
jj=0
|
|
for j=i*6 to j+5
|
|
.map(chr$(.a[j]))=mid$(.b, i+1,1)+mid$(.b,jj+1, 1)
|
|
.map2(mid$(.b, i+1,1)+mid$(.b,jj+1, 1))=chr$(.a[j])
|
|
jj++
|
|
next
|
|
next
|
|
}
|
|
Public:
|
|
Module SetRandom (&returnvalue) {
|
|
return .a, 0:=str$("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
|
|
for i=1 to 100
|
|
c=random(0, 35):d=c
|
|
while c=d {d=random(0, 35)}
|
|
byte o=.a[c]
|
|
.a[c]<=.a[d]
|
|
.a[d]<=o
|
|
next
|
|
returnvalue=chr$(eval$(.a)) ' convert to UTF16LE
|
|
.preparemaps
|
|
}
|
|
Module SetSpecific (that$){
|
|
return .a, 0:=str$(Ucase$(that$))
|
|
.preparemaps
|
|
}
|
|
Module SetKey (.key as string) {
|
|
.key<=ucase$(.key)
|
|
if len(.key)<7 or len(.key)>12 then Error "Key has not proper length"
|
|
if filter$(.key, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")<>"" then
|
|
Error "Key has bad letters"
|
|
end if
|
|
dim aa(1 to len(.key))
|
|
for i=1 to len(.key):aa(i)=mid$(.key,i,1):next
|
|
.orderkey<=aa()#sort()#str$("")
|
|
}
|
|
Module Display {
|
|
Print "The 6 x 6 Polybius square:"
|
|
Print " | A D F G V X"
|
|
Print "---------------"
|
|
for i=0 to 5
|
|
Print mid$(.b,i+1,1)+" | ";
|
|
jj=0
|
|
for j=i*6 to j+5
|
|
print chr$(.a[j]);" ";
|
|
jj++
|
|
next
|
|
print
|
|
next
|
|
Print "Key:";.key
|
|
}
|
|
Function Encrypt(p as string) {
|
|
crypted=""
|
|
for i=1 to len(p)
|
|
crypted+=.map$(mid$(p,i,1))
|
|
next
|
|
m=1
|
|
encrypted=""
|
|
For i = 1 To Len(.key)
|
|
ch = Mid$(.orderkey, i, 1)
|
|
For j = Instr(.key, ch) - 1 To Len(crypted) - 1 Step Len(.key)
|
|
encrypted += Mid$(crypted, j + 1, 1)
|
|
if m mod 5=0 then encrypted += " "
|
|
m++
|
|
Next
|
|
Next
|
|
=encrypted
|
|
}
|
|
Function Decrypt(p as string) {
|
|
p=filter$(p, " ")
|
|
decrypted=""
|
|
m=1
|
|
dim b$(len(p))
|
|
For i = 1 To Len(.key)
|
|
ch = Mid$(.orderkey, i, 1)
|
|
For j = Instr(.key, ch) - 1 To Len(p) - 1 Step Len(.key)
|
|
b$(j)=mid$(p, m, 1)
|
|
m++
|
|
Next
|
|
Next
|
|
for i=0 to len(b$())-1 step 2
|
|
decrypted+=.map2(b$(i)+b$(i+1))
|
|
next
|
|
=decrypted
|
|
}
|
|
}
|
|
ADFGVX=cipher()
|
|
for ADFGVX {
|
|
.SetSpecific "A9GKMF1DQRSBVX8Z0WTEJLOPY5U4CN2H76I3"
|
|
.SetKey "volcanism"
|
|
.Display
|
|
encode=.Encrypt("ATTACKAT1200AM")
|
|
Print "Encoded: ";encode
|
|
Print "Decoded: ";.Decrypt(encode)
|
|
Rem { ' using randomblock
|
|
thisblock=""
|
|
.SetRandom &thisblock
|
|
Print "Random Block:";thisblock
|
|
.Display
|
|
encode=.Encrypt("ATTACKAT1200AM")
|
|
Print "Encoded: ";encode
|
|
Print "Decoded: ";.Decrypt(encode)
|
|
}
|
|
}
|
|
}
|
|
CheckADFGVX_Cipher
|