個人的なメモを EvernoteからObsidianに移行しましたが、 Evernoteの中で暗号化していた部分があり、 それをObsidian上で復号するプラグインを作りました。
- EvernoteからObsidianへの移行
- 暗号化の処理
- Evernote Decryptor
- 以前までの機能
- v2.Xの機能
- Evernoteの暗号化
- Exportされたノートの暗号化部分
- まとめ
- おまけ: Decryptor or Decrypter
EvernoteからObsidianへの移行
移行したのは半年くらい前。
暗号化の処理
そこから暗号化されたものをどうするかということで、 しばらくは必要な部分だけEvernoteで見る、ということをしていました。
一方、Obsidianには encrypt、 Inline Encrypter といったプラグインがあり、これらでノート全体を暗号化したり、 ノート内の選択部分を暗号化したりすることが出来、 特にInline Encrypterの方は 表示上SECRETな感じの記号にしてクリックすると パスワードを入力して復号させる、といった Evernoteの暗号化部分と似たような動作を実現することが出来ます。
なのでObsidian上で改めて暗号化する場合にはこれらのプラグインを使えばいいのですが、 Evernoteからimportしたノートの暗号化部分は別。
最悪、一度Evernoteで復号してからObsidianにコピペして必要であれば再度暗号化する、という方法もあるのですが、 流石に面倒。
なんとか直接Obsidian上で復号できないかということで、 そのためのプラグインを作りました。
Evernote Decryptor
すでにOfficial Pluginとして入れてもらっているので Community Pluginsからインストールできます。
Community Pluginsにいれるには Obsidian-releases というレポジトリにPull Requestを送る必要があるのですが、 かなりの量のPull Requestが溜まっていてレビューしてもらうのにちょっと時間がかかることもあるようです。
実は年末に出したのでちょっと年をまたいで最初の返信が1週間ほど後でしたが、その際あった些細な訂正(説明にObsidian Plugin for...
みたいにObsidianを入れるのは冗長だから外して、など)
を即座に直して送ったものの、次に見てもらったのが1ヶ月以上後でした(かつ別の人)。
Add plugin: Evernote Decryptor by rcmdnk · Pull Request #2816 · obsidianmd/obsidian-releases
今から新たにプラグインを追加したいという場合には まずは Submission requirements for plugins - Developer Documentationをちゃんと読んで対応し、 他のPR(特に修正を促されているもの)を参考にして できるだけ一発で行けるようにしておいた方が良いです。
半年くらい前に作ったプラグインですが、 今回大幅にアップデートしたのでそのご紹介。
以前までの機能
v1.Xのときの機能は、変数時にテキストを選択して右クリックすると
Decrypt Evernote encrypted data
というメニューが出るのでそれをクリックすると復号される、というものでした。
Evernoteで暗号化された部分はimportされると
1
|
|
みたいな文字列になっています。
この暗号化された部分全体を選択して右クリックすると パスワード入力のモーダルが立ち上がるのでそこに正しいパスワードを入力するとこの文字列が復号されそれに置き換わります。
ちなみに上のは1234
を1234
のパスワードで暗号化したもの。
こういう暗号化とかハッシュ化とかされたものが他に無ければだいたい見た目で暗号化された部分だな、というのはわかると思います。
そうでなくとも前後の文脈で分かることがほとんどだと思いますが。
また、Evernoteの暗号化の仕組み上、
必ずRU5DM
で始まるので、なんらか機械的に見つけることも可能だとは思います。
v2.Xの機能
先日リリースしたv2.Xでは、Inline Encrypterを参考に 暗号化された部分をInline Code Blockに変換し、 その部分を見た目上ボタンのようにしてクリックすると パスワード入力のモーダルが立ち上がり、 正しいパスワードを入力するとその部分が復号され、そのパスワードは一時的にモーダル上に表示される、というものに変更しました。
いちいち置き換えられても、それをCtrl-Zで戻す、みたいな不毛な作業もこれでなくなります。
Inline Code Blockはevernote_secret
というキーワードで始まるものとして、そのような部分の見た目を変える仕組みも入れました。
Inline Encrypterとは違い画像ではなく単にHTMLのボタン表示ですがシンプルで十分かな、ということでそれにしてあります。
ということで、暗号化された部分を選択して 右クリックから Format Evernote secret というコマンドを実行すると
1
|
|
の様に変換され、その部分がボタン表示されるようになります。
Reading modeでもLive Previewでも動作します。
このボタンをクリックするとパスワード入力のモーダルが立ち上がり、正しいパスワードを入力するとその部分が復号されます。
この部分に矢印キーなどで移動していくと元のInline Code Blockの文字列が表示され編集することも可能です。
逆に、手動でevernote_secret ...
というInline Code Blockを作れば暗号化されたものでなくても同じようにボタン表示されます。
上のコマンドの代わりに直接書き換えてもOK。
もし、以前のように単に暗号化された部分を復号して置き換えたい場合は、Decrypt Evernote encrypted data and replaceを使ってください。
また、ボタン化せずに単に一時的に復号したものを見たい場合は Decrypt Evernote encrypted data。
逆に、暗号化したテキストがあり、それをEvernote Decryptorで管理する暗号にしたい場合にはテキストを選択して Encrypt data as Evernote secretを実行します。
これに関してはInline Encrypterでも似たような事が出来ますが、 Evernote Decryptorだけで済ませる事もできるのでこういった機能があっても良いかな、ということで。
一旦ボタン化が済むと右クリックメニューは要らなくなるかもしれませんが、その場合はオプションから消すことも出来ます。
また、最初のバージョンはモバイルには非対応でしたが、 v2.Xではモバイルアプルでも動作するようになっています。
Evernoteの暗号化
Evernoteの暗号化の方法は2014年に一度変更されています。
このプラグインは2014年の変更以降のAES 128bitを使ったものにのみ対応しています。
What type of encryption does Evernote use? – Evernote Help & Learning
公式の情報だけだと実際にどのように暗号化されているのかすぐにはわかりませんが、 そのあたりはすぐに解析していた人がいて、以下の記事が恐らく一番早く出て詳しいものだと思います。
ここから先頭にENC0
という4byteが入っていて
これが暗号化後にRU5DM
となる元です。
上のページにはPythonの例がありますが、 他の言語で書かれた例も探せば色々と出てきます。
Yarle というツールはEvernoteからexportされたファイルを解析して扱えるようにするツールですが、この中にTypeScriptで書かれた例があります。
このYarleはImporterプラグインの中にもここからコードが移植されて使われています。 (ただし、暗号化部分はImporterでは何もせずにそのまま出している。)
この辺を参考にしつつプラグインを作りました。
Exportされたノートの暗号化部分
現状ImporterプラグインでObsidianにimportすると 暗号化部分は暗号化された状態の文字列がそのまま出てきます。
ExportされたENEXファイルを見てみると、暗号化された部分は
1 2 3 4 5 6 7 8 9 |
|
みたいな感じで、en-crypt
というタグで囲まれた部分になっています。
なので解析的にこの部分を見つけて暗号化された部分だと判断することができます。
実際、Yarleの中でもこの部分を見つけて暗号化された部分だと判断し、オプションでパスワードを渡しておくと復号して出力するようになっています。
ただし、ObsidianのImporterプラグインにはその復号部分は移植されていません。
この部分、Importerをちょっといじって暗号化された部分をevernote_secret...
をつけてInline Code Blockになるようにできないか、とちょっと考えています。
追記: 2024/06/14
Importerプラグインをいじって暗号化された部分をevernote_secret...
をつけてInline Code Blockに変換するプラグインを作りました。
これを使うと、Importerプラグインでimportしたノートの暗号化された部分がevernote_secret...
という形に変換されます。
現状Community Pluginsには入れてないので、 BRATを使ってインストールする必要があります。
BRATをCommunity Pluginsからインストールして有効にして、BRATの設定のAdd Beta plugin with frozen version
から
- Repository: https://github.com/rcmdnk/obsidian-importer-for-evernote-decryptor
- The release version tag: 1.6.999
でインストール出来ます。
オリジナルのImporterプラグインとconflictしてしまうので、もし入れてる場合はオリジナルのほうを無効にするかアンインストールしてから入れてください。
追記ここまで
まとめ
半年くらい中途半端な(でもversion 1にしてしまった)状態で Community Pluginsにも入れてもらっていましたが、 2.0になって自分的にちゃんと思った通りの事ができるように出来ました。
もしかしたら既に使っていて取り敢えず、で使っている人が居たらアップデートしてボタン化して使ってみてほしいです。
おまけ: Decryptor or Decrypter
今回のプラグイン名、Decryptor
とor
なのですが、
Decrypter
という表記もあります。
どちらも間違いでは無いようですが、
あまり意識せずにつけてて、今回これかいてて、
Inline Encrypterはer
だな、と思って、違うな、と。
grammar - Is it Decryptor or Decrypter? - English Language & Usage Stack Exchange
ここには
Decrypter seems to be the slightly better option because it’s the more common form (especially in Great Britain)
とあったり、
According to Google Ngrams “-or” is very slightly more popular. Although only “-er” occurs in the British English sources. I’m not sure how much Google Ngrams can be trusted for the, though.
とあったり。イギリス英語だとer
?
-
最終的に
btoa
関数でBase64エンコードされています。btoa
では元の文字列を6bitsずつに分けたうえでそれぞれに対応する文字列を与えます。 足りない部分は0で埋めます。また、最終的に文字数が4の倍数になるように、足りない部分には
=
が追加されます。したがって、もともと4文字の
ENC0
では全部で4x8=32bitsとなり、 30bits分はそれぞれ6bitsで決まります(つまりは5文字分)。最後の余った2bitsは次に文字が無ければ4つの0で埋められます。 もし次に文字があれば、その文字の上位4bitsが加えられたうえで対応する文字が与えられます。
したがって最初の
RU5DM
の部分が常にfixされたものになります。仮に
ENC0
を直接botaに与えるとRU5DMA==
となります。A
はENC0
の次に来るもの次第で変わり、==
は全体の長さ次第でいくつ加わるか変わります。(0~3つ)