問題

OpenSSL 3.xではBlowfishという暗号アルゴリズムがdeprecatedされ、デフォルトではロードできなくなった。mikutterはBlowfishでsecretを暗号化しているためそういう環境で死ぬ。

バグ #1585: OpenSSL 3.x 環境 (ubuntu 22.04 等) で mikutter が起動しない - mikutter - やること

deprecatedなものをビルドしないというオプションを明示的に指定しない限り、Blowfishもlegacy providerとしてロードすることはできる。しかし現状のRubyはlegacy providerをサポートしていない。ちょっと待てばlegacy providerサポートが入りはする。

https://github.com/ruby/openssl/pull/635

とはいえ時間がかかるし、legacy providerなしでOpenSSLをビルドしているような環境でどうなん?という問題もある。一回マイグレーションさえすればもっとロバストな暗号化アルゴリズムに変換できるので、自力でdecryptを再実装したい。

調査

mikutterの実装

mikutterは Plugin::World::Keep で以下のようにしてsecretを暗号化している。

  def encrypt(str)
      cipher = OpenSSL::Cipher.new('bf-ecb').encrypt
      cipher.key_len = ACCOUNT_CRYPT_KEY_LEN
      cipher.key = key
      cipher.update(str) << cipher.final end

/plugin/world/keep.rb - mikutter - やること

OpenSSL::Cipher はRubyにバンドルされている。

ドキュメント:

class OpenSSL::Cipher (Ruby 3.2 リファレンスマニュアル)

実装:

https://github.com/ruby/openssl

OpenSSL側の実装

OpenSSLの気持ちは全然知らないので、とりあえず雰囲気を掴むためにOpenSSLでBlowfishがどういう実装をされているか見てみる。

https://github.com/openssl/openssl