2012年8月27日月曜日

EPUB用自作DRMの挑戦 失敗編

[EPUB用自作DRMの挑戦 失敗編]

EPUB用にDRMが自力で実装できるか挑戦してみた。
が、表題の通りに失敗に終わる。

とりあえず、目標としてはEPUBの仕様に則り(個人的には則ったつもり)

  1. コンテンツを暗号化

  2. encryption.xmlの作成

  3. EPUB3に対応したビューアでコンテンツを読む

を目指してみた。
上記を順を追って以下につらつら書いていくが、結果的に失敗しているので、
どこが悪いのかまったくわからない
もしくは、悪そうなとこイメージできるが確証が持てない
言う状態。
闇雲にアプローチして来たけど、ちょっと目標を達成する算段が
つかないので、区切りを入れる為に失敗編を作成。
今後は成功編ができるように願うばかり。

1.準備


最初にsigilを使用して何でもいいのでepubファイルのワンセットを作成。
ここでは『drmtest.epub』という名前で保存。

で、保存されたファイルの拡張子をzipに変更し、解凍する。
すると以下の構成でフォルダが出来上がる。

drmtest/META-INF/container.xml
drmtest/OEBPS/content.opf
drmtest/OEBPS/toc.ncx
drmtest/OEBPS/Text/Section0001.xhtml

ここまでコンテンツの準備。

2.コンテンツを暗号化


ここではAES128-CBCでコンテンツを暗号化するのを考える。
encryption.xmlがW3CのXML暗号化仕様(XML Encryption Syntax and Processing)
に準拠している事からこの規格をサポートしているeclipse+XMLSecurityToolsプラグインを使ってコンテンツを暗号化する。
(encryption.xmlの定義はEPUB Open Container Format (OCF) 3.0で定義
されている。どういった内容なのかは一先ず触れずに放っておく。)

先ずはeclipseにコピー。ファイル名を『Section0001.xhtml』 -> 『Section0001.xml』に変更。
先ほどの『Section0001.xml』を右クリックして[XML-Security]->[Encryption]を選択
(選択すると凄い時間がかかる場合がある)


特に何も設定せず[次へ]



[Encryption and Cipher Algorithms]に「AES128」、「AES-128 Key Wrap」を設定
[Key File]に「AES」、「128」、ファイル名に「..\META-INF\example.key」を指定
[Encryption ID]に「example」を指定
設定したら[完了]
(完了すると凄い時間がかかる場合がある)


『example.key』と暗号化された『Section0001.xml』が出来上がり。


ここまでで、コンテンツの暗号化が完了

3.encryption.xmlの作成



META-INFフォルダに空の『encryption.xml』を作成する。
にある例の内容をコピー


a.『encryption.xml』の内容を暗号化した『Section0001.xml』から一部コピーして置き換える
b.[enc:EncryptedKey]内にある[enc:EncryptionMethod]の[Algorithm]属性に「http://www.w3.org/2001/04/xmlenc#kw-aes128」を設定
c.[enc:EncryptedData]内にある[enc:EncryptionMethod]の[Algorithm]属性に「http://www.w3.org/2001/04/xmlenc#aes128-cbc」を設定
d.[enc:EncryptedKey]内にある[enc:CipherData]の[enc:Ciphervalue]のに『Section0001.xml』の同値を設定
e.[enc:EncryptedData]内にある[enc:CipherData]の[enc:CipherReference]の[URI]属性に「OEBPS/TEXT/Section0001.xml」を設定

『Section0001.xml』のファイル名を『Section0001.xhtml』に変更
また、中身を暗号化されたデータのみにする為、[enc:EncryptedData]内にある[enc:CipherData]の[enc:CipherValue]の値以外を削除



ここまでで、encryption.xmlの作成が完了

4.EPUB3に対応したビューアでコンテンツを読む


ここではepubファイルの再構築、チェック、実際にビューアーで確認まで。

先ずはepubファイルの再構築は、EPUB3 チュートリアルを参考に作成。
特に『編集したファイルをEPUBにする』の章を参考に以下のコマンドで『drmtest.epub』を作成する


cd drmtest
zip -0 ..\drmtest.epub mimetype
zip -r ..\drmtest.epub * -x mimetype


ビューアで見る前にEPUBチェックツールのepubcheckで確認
結果は


Epubcheck Version 3.0b5
ERROR: drmtest.epub: Extra field length for first filename must be 0, but was 11
4
Validating against EPUB version 2.0
ERROR: drmtest.epub/OEBPS/Text/Section0001.xhtml(1,1): プロローグにはコンテンツ
を指定できません。
ERROR: drmtest.epub/OEBPS/Text/Section0001.xhtml: プロローグにはコンテンツを指定
できません。
Check finished with warnings or errors


encryption.xml以外でエラーが出る。どうやらxhtmlファイルの文書宣言の前にデータがあるのがダメらしい。どこかに仕様の矛盾か私のコンテンツに不正があると考えられる。
と思ったら、epubcheckのソースコードを覗いてみたらencryption関係は未実装部分が多くチェックをほとんどしていないみたい。複合化とか関係無しにxhtmlファイルとして解釈していたので、あんまり意味無かった。

で、強引にibooksで開いた場合には以下のようになる。

残念。失敗。


考察


とりあえず、今回の挑戦でダメそうな所を考えてみる。

  1. encryption.xmlの用途は正しいか?:暗号化する時の情報の一部を参考用に書くのが目的のファイルだったりすると、私の解釈が間違っている事になるかと。

  2. 鍵はどうした?:コンテンツを暗号化した時に「鍵」も「キーワード」も作成された。が、それはビューワで参照されているのか?
    現状では鍵をどうやって参照するように定義したらいいのか不明。『encryption.xml』のに定義すると思うんだが、イマイチ
    確信を持ってここだと定義する方法がわからない。一先ずの解釈では【にある】がを複合化する
    「鍵」で、を複合化する「鍵」をどこかに定義する必要があると考えられる。普通のviewrはどうしてんだろ?
    『encryption.xml』だけじゃ足りないんじゃないか??

  3. ビューワはencryption.xmlに対応しているのか?ibooksで提供されているファイルは『encryption.xml』が含まれており、Appleが提供している
    『fairplay』というDRMが定義されている。ただ、『fairplay』以外のDRMをサポートしているかが不明。用意したコンテンツが悪いのかibooksが対応して
    ないのかはわからない。両方かもしれん。あとreadiumを調べてみたけど対応しないし、する予定も無い(FAQより)らしい。
    まぁオプショナルだと言われると強気にはなれない。


今できそうなとこはこんくらいか。。。自力じゃさすがに限界が見えてきた。
あとはもう少し暗号化について調べるのと、ビューワーがどういう作りになってるか調べるぐらいかな。各ビューワでDRMの仕様を組むのは需要に応えた結果だとは思うんだけど、組む方法は提供してもらえないものなんだろうか?別に保障とかは求めて無いんだが。

0 件のコメント :

コメントを投稿