Zarutian 20:06 30. desember 2006 (UTC): Not finished yet
[gg
] 21:52 (GMT+01) 2006-12-30: Changed "SH" to "SA" (that is the correct term). You also need to link to the license if you want legal coverage, as far as I am aware.
Zarutian 21:55 30. desember 2005 (UTC): Details details. And legal coverage where?
#####################################################
# Tcl Code below by Zarutian here by released under #
# CreativeCommons SA-BY license. Contact him if any #
# other license is required. #
# (SA stands for Share Alike and BY for give credit #
# to who ever wrote the software or parts there of) #
# http://creativecommons.org/licenses/by-sa/2.5/ #
#####################################################
proc repeat {body keyword cond} {
uplevel 1 $body
if {$keyword == "until"} {
set cond "!([set cond])"
} elseif {$keyword == "while"} {
# left empty on purpose
} else {
error "repeat expected 'while' or 'until' as an keyword"
}
while {[uplevel 1 [list expr $cond]]} {
uplevel 1 $body
}
}
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"}
append keystream $new_bit
} until {[string length $keystream] == $keystream_length}
return $keystream
}
proc crypt_with_shrinking_generator {seedA polynominalsA seedS polynominalsS message} {
binary scan $message B* message
set keystream [shrink_generate_keystream $seedA $polynominalsA $seedS $polynominalsS [string length $message]]
set result ""
set index 0
repeat {
append result [XOR [string index $keystream $index] [string index $message $index]]
incr index
} until {$index == [string length $message]}
return [binary format B* $result]
}