最後。
require "openssl"
passwd = "piyo"
regist_address = 'XFALilSWAmQOfmhjwOwVlA=='
enc = regist_address.unpack('m').first
dec = OpenSSL::Cipher::BF.new("ECB").decrypt
dec.key_len = passwd.length
dec.key = passwd
dec.padding = 0
dec.update(enc)
で復号化できたー。 元々 ECB だったのを CBC だと思い込んだので、思わず色々理解できた :)。
でまぁ、折角なので、CBC でも decrypt できるようにしてみる。 ここの図が分かりやすい。
def _decrypt(s)
o = ""
yl, yr = @bf.iv
(s.length / 8).times do
bl = l = to32(s[0..3])
br = r = to32(s[4..7])
s[0..7] = ""
l, r = yield(l, r)
l ^= yl
r ^= yr
(0..3).each{|n| o << from32(l, n)}
(0..3).each{|n| o << from32(r, n)}
yl = bl
yr = br
end
o
end
復号化なので、暗号文を切り出して(to32)、次の入力用に保存しつつ(bl, br)、 復号化処理(yield の先の @bf.decipher)して、前回からの入力(最初は iv)と XOR して、 平文を保存(from32)。保存しといた暗号文を次回の入力に。 もう、yield を使って他の処理を共通化する必要もないけど。