In progress
proc XOR args { if {[llength $args] == 1} { set args [lindex $args 0] } set work [lindex $args 0] set args [lrange $args 1 end] foreach item $args { set work [expr $work ^ $item] } return $work } proc leftshift {current polynominals} { set selected [list] foreach selector $polynominals { lappend selected [string index $current $selector] } set new_bit [XOR $selected] return "[string range $current 1 end][set new_bit]" } proc shrink_generate_keystream {seedA polynominalsA seedS polynominalsS keystream_length} { set registerA $seedA set registerS $seedS set keystream {} repeat { repeat { set new_bit [string index [set registerA [leftshift $registerA $polynominalsA]] end] } until {[string index [set registerS [leftshift $registerS $polynominalsS]] end] == "1"} } until {[string length $keystream] == $keystream_length} }