2006-09-05

_ [ruby] openssl

最後

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 を使って他の処理を共通化する必要もないけど。

_ TOWER of TERROR

あれ日本に来たんだ。新婚旅行でフロリダに行ったときに乗ったんだけど、 結構びびったなぁ。乗りたい。

んーでも、こんなシートベルトだったっけな?日本仕様?

[]