Simple Watermark Tool

Copyright (C) 1997-2004 by Haruaki TAMADA All rights reserved.
Last Modified: Mon Jan 10 11:07:31 JST 2005

[ Japanese | English ]

目次

ページのトップへ

概要

簡単な透かしを class ファイルに入れます。非常に脆いです。 class ファイルの構造を知っている人や class ファイルの構造を表示、編集できるアプリケーションなら簡単に透かしを外せます。 また、や class ファイルを最適化するような Optimizer などでは 強制的に外されてしまうでしょう。

しかし、他の透かしと組み合わせて、この透かしを入れるのならば有効かもしれません。

実際に用いるのは jmark の方が良いと思います。

ページのトップへ

特徴

API ドキュメント [フレームなし]

ページのトップへ

動作

このツールの透かしの入れ方は非常に単純です。 以下にこのツールの透かしの入れ方、取り出し方を説明します。

透かし挿入

class ファイルから WATERMARK という名前の attribute_info を探します。もしなければ constant_pool に WATERMARK という Constant_Utf8 というエントリを追加します。

与えられたキーでデータを暗号化し、それを本体とする attribute_info を作成します。ここの attribute_info の tag は BCEL の org.apache.bcel.classfile.Unknown を使っているので -1 になっています。ここで作成した attribute_info を class ファイルに 加え、ファイルとして書き出せば透かし挿入完了です。

透かし取り出し

class ファイルから WATERMARK という名前の attribute_info を探します。もしこの attribute_info がなければ透かしが入っていないとして終了します。

見つかった attribute_info からバイト配列を取り出し、 与えられたキーで復号化し、復号されたものを表示して終了します。

ちなみに、ここで使っている attribute_info の構造は以下の通りです。

watermark_attribute_info{
    u2 attribute_name_index;
    u4 attribute_length; 
    u1 info[attribute_length];
}

ページのトップへ

ライセンス

GNU GPL(GNU General Public License) に従います。

GNU General Public License [日本語]

GPL に関するリンク

GPL, LGPL, GFDL に対する違反行為
ライセンスの違反行為を見つけた場合の対処方
さまざまなライセンスとそれらについての解説
いろいろなライセンスがあります。
フリーソフトウェアは売るのも自由
勘違いしている人も多いようだが、GPL ライセンスでも販売可能です。
GPL Memo
GPL は難しいということを前提に、GPL を理解しようというページ

GNU の GPL FAQ に以下の質問とその回答がありました。

Q. Java のようなオブジェクト指向言語において、 GPL が適用されたあるクラスをそれ自体は改変せず、 サブクラス化して利用するとします。 このような場合、GPL は結果としてのプログラムには どのように影響するのでしょうか?

A. サブクラス化は派生物の作成に他なりません。 そこで、GPL が適用されたクラスのサブクラスが作成された プログラム全体に GPL の条項が影響します。

だそうです。

ページのトップへ

ダウンロード

swt-1.0.0.tar.gz [src + classes + lib]
md5sum: 1e6d156eb488a399a261cb458b501aae
swt-1.0.1.tar.gz [src + classes + lib]
md5sum: e5a6b209d2ba466b8b26782acacbd5d0
swt-1.1.0.tar.gz [src + classes + lib]
md5sum: 5e0637a5f4b54443d2935ba9f06e441d

ChangeLog

ページのトップへ

必要ライブラリ

Java 2 SDK 1.4 以降の環境が必要です。1.4 より以前の環境では JCE をインストールしなければなりません。

BCEL
Class ファイルを扱うために使用。必須。
Apache Ant
ビルド時に使用。 使わなくても構わないが、使わない場合の質問は受け付けません。必須。
Jakarta Velocity
このドキュメントの生成に使用。詳細は anakia を参照のこと。

JCE をインストールするには

ここでの説明は非常に簡単であり、このまま実践することはお勧めしません。 かと言って、これ以上説明するつもりもありません。 こうすれば動くという最低限の説明であることを理解した上でこの作業は行って下さい。

そんなのはヤダという方は Java 2 SDK 1.4 以降を使って下さい。

まず、jce をダウンロードします。 次にダウンロードした zip ファイルを展開し、展開してできた jce1.x.x ディレクトリの lib 以下にある jar ファイルを全て $JAVA_HOME/jre/lib/ext 以下にコピーします。

$JAVA_HOME/jre/lib/security/java.security ファイルに以下の一行を追加します。

security.provider.3=com.sun.crypto.provider.SunJCE

上記の 3 の部分は重複しない一番若い番号を指定して下さい。

以上で JCE のインストールは完成です。 $JAVA_HOME/jre/lib/ext 以下に入れる人はまだいるのかなぁ。

ページのトップへ

インストール方法

配布される swt-x.x.x.tar.gz を展開する。

$ gzip -cd swt-x.x.x.tar.gz | tar xvf -

swt-x.x.x というディレクトリが作成されるので、 swt-x.x.x/bin にある swt スクリプトを使用する。

ページのトップへ

使い方

コマンドライン

swt version 1.1.0
swt [options...] <key> <classes...>
Argument:
  key:     データを埋め込む/取り出す際のキー。
  classes: 透かしを埋め込む/取り出すクラスファイル
Options:
  -w --watermark=<watermark> データ。必ず指定しなければならないオプション。
  -d --dest=<dest>           出力先のディレクトリを指定する
  -e --embed                 透かしを埋め込む際に指定する。(デフォルト) 
                             -p と同時に指定すると取り出しが優先される。
  -p --pickout               透かしを取り出す際に指定する。
                             -e と同時に指定するとこのオプションが優先される。

  -a --algorithm=<algorithm> アルゴリズムを指定する。デフォルトは PBEWithMD5AndDES。
                             何も指定しなかった場合は PBEWithMD5AndDES。
                             使用できるアルゴリズムは JCE に依存する。

  -c --provider=<provider>   JCE のプロバイダを指定する。SunJCE を指定すれば良い。
  -C --provider-class=<class> JCE のプロバイダクラスの完全修飾名。 
                             このオプションを指定すると addProvider 
                             メソッドを呼び出し、プロバイダを動的に登録する。

  -h --help                  このメッセージを表示。

Copyright by Haruaki TAMADA 2002-2003
swt home page is http://oikaze.com/~tamada/Products/swt/
Report bugs to tamada@oikaze.com

Apache Ant

Apache Ant から透かしを埋め込めるようにしました。取り出しは未対応です。 以下のようにして使用することが可能です。

サンプル

<taskdef name="watermark"
         classname="com.oikaze.tama.swt.WatermarkTask"
         classpathref="project.class.path"
/>
<mkdir dir="${watermark.test}" />
<watermark destdir="${watermark.test}"
           data="Copyright(C) by Haruaki TAMADA"
           key="watermark test key"
           basedir="${build.bin}">
  <include name="**/*.class" />
  <exclude name="**/*Test.class" />
</watermark>

パラメータは以下の通り。

Attribute Description Required
data 透かしに埋め込むデータ Yes
baseDir class ファイル検索の基準ディレクトリ No, 指定されなければプロジェクトのカレントディレクトリ
destDir 出力先のディレクトリ Yes
key データを暗号化する際のキー Yes
algorithm 暗号化のアルゴリズム。指定できる文字列は JCE のプロバイダに依存する。 No, 指定されなければ "PBEWithMD5AndDES"
provider 暗号化を提供するライブラリ名のプロバイダ名。デフォルトは SunJCE。 No, 指定されなければ "SunJCE"
iteration PBE(Private Base Encryption) での繰り返し回数。 No, 指定されなければ 20。
lastModifiedCheck 最終更新日を見て、更新するかどうかを決める。デフォルトは true。 No

ページのトップへ

TODO

High

Medium

Low

Wish

Dream

Wish や Dream は書いてみただけで今のところ全く対応する予定はありません。:-P まぁ、せめて ant のタスク位は書いた方が良いかなぁ。

ページのトップへ