So is there any way to make that 'pure tcl' code faster??
I don't eventually use eggdrop and I have some stability problems with crypto.mod or something..
Testing is done with eggdrop
Code: Select all
load crypto.so; # crypto.mod which provides bencrypt/bdecrypt - http://tclcryptography.sourceforge.net/
package require blowfish
package require math::bignum
set B64 "./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
proc encrypt2 {key text} {
return [bytetoB64 [::blowfish::blowfish -mode ecb -dir encrypt -key $key $text]]
}
proc decrypt2 {key text} {
return [string trimright [::blowfish::blowfish -mode ecb -dir decrypt -key $key [B64tobyte $text]] \0]
}
proc B64tobyte {ec} {
set dc ""
set k -1
while {$k < [expr [string length $ec] -1]} {
set right [::math::bignum::fromstr 0]
set left [::math::bignum::fromstr 0]
for {set i 0} {$i < 6} {set i [expr $i+1]} {
set k [expr $k+1]
set right [::math::bignum::bitor $right [::math::bignum::lshift [::math::bignum::fromstr [string first [string index $ec $k] $::B64]] [expr $i*6]]]
}
for {set i 0} {$i < 6} {set i [expr $i+1]} {
set k [expr $k+1]
set left [::math::bignum::bitor $left [::math::bignum::lshift [::math::bignum::fromstr [string first [string index $ec $k] $::B64]] [expr $i*6]]]
}
for {set i 0} {$i < 4} {set i [expr $i+1]} {
set j [expr (3 - $i) * 8]
append dc [format %c [::math::bignum::tostr [::math::bignum::rshift [::math::bignum::bitand $left [::math::bignum::lshift [::math::bignum::fromstr 255] $j]] $j]]]
}
for {set i 0} {$i < 4} {set i [expr $i+1]} {
set j [expr (3 - $i) * 8]
append dc [format %c [::math::bignum::tostr [::math::bignum::rshift [::math::bignum::bitand $right [::math::bignum::lshift [::math::bignum::fromstr 255] $j]] $j]]]
}
}
return $dc
}
proc bytetoB64 {ec} {
set dc ""
set k -1
while {$k < [expr [string length $ec]-1]} {
set k [expr $k+1]
set left [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 24]
set k [expr $k+1]
set left [::math::bignum::add $left [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 16]]
set k [expr $k+1]
set left [::math::bignum::add $left [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 8]]
set k [expr $k+1]
set left [::math::bignum::add $left [::math::bignum::fromstr [scan [string index $ec $k] %c]]]
set k [expr $k+1]
set right [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 24]
set k [expr $k+1]
set right [::math::bignum::add $right [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 16]]
set k [expr $k+1]
set right [::math::bignum::add $right [::math::bignum::lshift [::math::bignum::fromstr [scan [string index $ec $k] %c]] 8]]
set k [expr $k+1]
set right [::math::bignum::add $right [::math::bignum::fromstr [scan [string index $ec $k] %c]]]
for {set i 0} {$i < 6} {set i [expr $i+1]} {
append dc [string index $::B64 [expr [::math::bignum::tostr $right] & 0x3F]]
set right [::math::bignum::rshift $right 6]
}
for {set i 0} {$i < 6} {set i [expr $i+1]} {
append dc [string index $::B64 [expr [::math::bignum::tostr $left] & 0x3F]]
set left [::math::bignum::rshift $left 6]
}
}
return $dc
}
bind dcc - start dcc:start
proc dcc:start {hand idx arg} {
set key [randstring 50]
set text [randstring 500 " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"]
set start [clock clicks]
set a [encrypt $key $text]
putdcc $idx "eggdrop : [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
set start [clock clicks]
set b [bencrypt $key $text]
putdcc $idx "crypto.mod: [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
set start [clock clicks]
set c [encrypt2 $key $text]
putdcc $idx "pure tcl : [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
if {[string equal $a $b] && [string equal $a $c]} {
putdcc $idx "encrypt ok"
set start [clock clicks]
set c [decrypt $key $a]
putdcc $idx "eggdrop : [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
set start [clock clicks]
set d [bdecrypt $key $a]
putdcc $idx "crypto.mod: [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
set start [clock clicks]
set e [decrypt2 $key $a]
putdcc $idx "pure tcl : [set m [expr [clock clicks]-$start]] >> [expr $m/1000]ms"
if {[string equal $c $d] && [string equal $c $e]} { putdcc $idx "decrypt ok" }
}
}
Code: Select all
eggdrop : 212 >> 0ms
crypto.mod: 140 >> 0ms
pure tcl : 458417 >> 458ms
encrypt ok
eggdrop : 112 >> 0ms
crypto.mod: 80 >> 0ms
pure tcl : 640686 >> 640ms
decrypt ok
eggdrop : 241 >> 0ms
crypto.mod: 147 >> 0ms
pure tcl : 444290 >> 444ms
encrypt ok
eggdrop : 99 >> 0ms
crypto.mod: 73 >> 0ms
pure tcl : 655279 >> 655ms
decrypt ok
eggdrop : 210 >> 0ms
crypto.mod: 143 >> 0ms
pure tcl : 453591 >> 453ms
encrypt ok
eggdrop : 108 >> 0ms
crypto.mod: 73 >> 0ms
pure tcl : 642180 >> 642ms
decrypt ok
eggdrop : 213 >> 0ms
crypto.mod: 143 >> 0ms
pure tcl : 448376 >> 448ms
encrypt ok
eggdrop : 106 >> 0ms
crypto.mod: 111 >> 0ms
pure tcl : 641055 >> 641ms
decrypt ok