class Straddling
def initialize( key, n1, n2, n3 )
key = key+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
key = key.upcase.split(//).uniq
@key = key;@n1 = n1;@n2 = n2;@n3 = n3
end
def create
@board = Array.new(4)
k = 0;prev = ""
for a in 0..40 do
if (a == @n1 || a == @n2 || a == @n3)
@board[a] = " "
else
if ("A".."J") === prev
@board[a] = prev == "J"? 0:((prev)[0]-16).chr
else
@board[a] = @key[k] == " " ? "*" : @key[k]
k+=1
end
prev = @board[a]
end
end
return @board.to_s
end
def tp(key,text)
@key = key.split(//)
@text = text.gsub(' ','*').upcase.split(//)
end
def keygen
@keygen = Array.new
@checker_board = @board.to_s.split(//)
for a in 0..@text.length-1 do
found = @checker_board.index(@text[a])
if (0..9) === found
@keygen.push(found)
elsif (10..19) === found
@keygen.push(@n1,found%10)
elsif (20..29) === found
@keygen.push(@n2,found%10)
else
@keygen.push(@n3,found%10)
end
end
end
def e(key,text)
self.tp(key,text)
self.keygen
print "#{@keygen.to_s}\n"
@t = Array.new
@keygen.each do |value|
@t.push((@key[0].to_i+value.to_i)%10)
@key << @key.shift
end
print "#{@t.to_s}\n"
print "Encrypt=#{self.show}\n"
end
def d(key,text)
self.tp(key,text)
self.keygen
@t = Array.new
@keygen.each do |value|
@t.push((value+10-(@key[0]).to_i)%10)
@key << @key.shift
end
print "Decrypt=#{self.show.gsub('*',' ')}\n"
end
def show
a = 0
result = ""
while a < @t.length
unless @t[a] == @n1 || @t[a] == @n2 || @t[a] == @n3
result = result + @checker_board[@t[a]]
else
result = result + @checker_board[(@t[a] == @n1 ? 1 : @t[a] == @n2? 2:3)*10+@t[a+1]]
a+=1
end
a+=1
end
return result
end
end
board = Straddling.new("sharpen your saw",2,5,9)
puts(board.create)
board.e("2641","programming praxis")
board.d("2641","S811R53S87A18RUAS8PSSH5")
puts("\n\n")
board = Straddling.new("my secret keys",2,5,9)
puts(board.create)
board.e("241","ruby programming rocks")
board.d("241","SF5E5*5MIREESEACY45YIS5****MESE")