GroovyでRijndael(Rijn.dll)を使用した暗号化・復号化

暗号化ソフトのうちの1つにファイル暗号化ソフト「ED」がある。
名前が微妙なのだが・・・
バッチ化したいだが、スクリーンセーバーが動作してる場合やロックがかかってると、
どうも待ちになってしまうようだ。
なので、EDでも使っているRijndael(Rijn.dll)を使用した暗号化・復号化するGroovyスクリプト
作ってみた。


結論としては、EDとの互換性はない。orz
EDで暗号化したものを、Rijndael(Rijn.dll)で復号化はできないし、
逆に、Rijndael(Rijn.dll)で暗号化したものを、EDで復号化もできない。



1. DLLのダウンロード

ファイル暗号化DLL「ラインドール(rijn.dll)」からダウンロードする。

2. PATHの設定

3. JNAの設定

JNAを使用するための設定

1)ダウンロード

https://jna.dev.java.net/servlets/ProjectDocumentList から 「3.2.7」 をダウンロードする

2)CLASSPATHの設定

以下をクラスパスに設定する。

  • C:\usr\lib\sun.com\jna\3.2.7\jna.jar
  • C:\usr\lib\sun.com\jna\3.2.7\platform.jar

Groovyスクリプト

import com.sun.jna.Library
import com.sun.jna.Native

public interface RijnLibrary extends Library {
    /* rijn.dll */
    RijnLibrary INSTANCE = (RijnLibrary)Native.loadLibrary("rijn", RijnLibrary.class);
    
    
    /*int EncryptFile(char* SourceFileName, char* DestFileName, char* password) */
    Integer EncryptFile(String sourceFileName, String destFileName, String passWord)
    
    /*int DecryptFile(char* SourceFileName, char* DestFileName,char* password) */
    Integer DecryptFile(String sourceFileName, String destFileName, String passWord)
}

class RijnException extends Exception{
    RijnException(){
        super()
    }
    RijnException(String msg){
        super(msg)
    }
}

class RijnEncryptFileException extends RijnException{
    RijnEncryptFileException(){
        super()
    }
    RijnEncryptFileException(String msg){
        super(msg)
    }
}

class RijnDecryptFileException extends RijnException{
    RijnDecryptFileException(){
        super()
    }
    RijnDecryptFileException(String msg){
        super(msg)
    }
}


GROOVY_VERSION = org.codehaus.groovy.runtime.InvokerHelper.getVersion()
if (GROOVY_VERSION <= "1.7.0") {
    throw new RijnException("Groovy 1.7.0以上が必要");
}

if (args.size() != 4 ) {
    throw new ArrayIndexOutOfBoundsException("USAGE:groovy ED.groovy ENC|DEC SourceFileName DestFileName PassWord\n")
}

mode = args[0]
srcFileName = args[1]
destFileName = args[2]
passWord = args[3]

if (mode == "ENC"){
    ret = RijnLibrary.INSTANCE.EncryptFile(srcFileName, destFileName, passWord)
    if (ret != 0) {
        switch (ret) {
            case -1:
                msg = "暗号化元ファイルオープン時エラー ($ret)"
            case -2:
                msg = "暗号化先ファイル作成時エラー ($ret)"
            case -3:
                msg = "暗号化時エラー ($ret)"
            default:
                msg = "unkown ($ret)"
        }
        throw new RijnEncryptFileException(msg)
    }
    println "正常終了:暗号化"
    
    
} else if (mode == "DEC") {
    ret = RijnLibrary.INSTANCE.DecryptFile(srcFileName, destFileName, passWord)
    if (ret != 0) {
        switch (ret) {
            case -1:
                msg = "復号元ファイルオープン時エラー ($ret)"
            case -2:
                msg = "復号先ファイル作成時エラー ($ret)"
            case -3:
                msg = "復号時エラー ($ret)"
            default:
                msg = "unkown ($ret)"
        }
        throw new RijnEncryptFileException(msg)
    }
    println "正常終了:復号化"

}else {
    throw new ArrayIndexOutOfBoundsException("USAGE:groovy ED.groovy ENC|DEC SourceFileName DestFileName PassWord\n")
}

使い方

groovy ED.groovy ENC 暗号化するファイルの絶対パス 暗号化したファイルの保存先の絶対パス パスワード
groovy ED.groovy DEC 復号化するファイルの絶対パス 復号化したファイルの保存先の絶対パス パスワード

JavaでもDESアルゴリズムやその他のアルゴリズムで暗号化・復号化する方法はあるから、
EDとの互換性がないのなら、Rijndael(Rijn.dll)のDLLを使う必要はないんだけどね。
ファイルの絶対パスを指定するだけでいいのは楽かも。