Rhinoで暗号化と復号化の方法を紹介します。ここでは、Javaの暗号化APIを利用して、Blowfishで暗号化・復号化してみます。

ちなみに、暗号化したデータは、BASE64化するので、Rhino以外に、別途ApacheのCommons Codecが必要です。こちらから入手できます。

//---------------------------------------
//  Blowfish暗号化を行うプログラム
//---------------------------------------
var password = "ここにパスワード";
var data = "Hello, World!";
// 暗号化
var enc = encryptData(password, data);
print(enc);
// 復号化
var dec = decryptData(password, enc);
print(dec)
//-----
// ファイルを暗号化する場合
var infile  = "hoge.doc";
var outfile = "hoge.encrypt"; 
var enc = encryptDataFromFile(password, infile);
saveText(outfile, enc, "UTF-8");   
// 復号化する場合
infile = "hoge.encrypt";
outfile = "hoge-enc.doc";
enc = readFile(infile);
decriptDataToFile(password, enc, outfile);

//---------------------------------------
// 暗号化を実行
function encryptDataBytes(key, data) {
  var sksSpec = new javax.crypto.spec.SecretKeySpec(
    getBytes(key), "Blowfish");
  var cipher =  javax.crypto.Cipher.getInstance("Blowfish");
  cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, sksSpec);
  enc = cipher.doFinal(data);
  return encodeBase64(enc);
}
function encryptDataFromFile(key, filename) {
  // ファイルの内容をbyte[]に読み込む
  var f = new java.io.File(filename);
  var data = java.lang.reflect.Array.newInstance(
    java.lang.Byte.TYPE, f.length());
  var bis = new java.io.BufferedInputStream(
    new java.io.FileInputStream(f));
  bis.read(data);
  bis.close();
  // 暗号化
  return encryptDataBytes(key, data);
}
function encryptData(key, str) {
  return encryptDataBytes(key, getBytes(str));
}
// 復号化を実行
function decryptDataBytes(key, encrypted) {
  var sksSpec = new javax.crypto.spec.SecretKeySpec(
    getBytes(key), "Blowfish");
  var cipher =  javax.crypto.Cipher.getInstance("Blowfish");
  cipher.init(javax.crypto.Cipher.DECRYPT_MODE, sksSpec);
  var enc = decodeBase64(encrypted);
  return cipher.doFinal(enc);
}
function decryptData(key, encrypted) {
  var dec = decryptDataBytes(key, encrypted);
  return "" + (new java.lang.String(dec));
}
function decriptDataToFile(key, encrypted, filename) {
  var dec = decryptDataBytes(key, encrypted);
  var fos = new java.io.FileOutputStream(filename);
  fos.write(dec);
  fos.close();
}
function getBytes(jsstr) {
  return new java.lang.String(jsstr).getBytes();
}
// base64変換 (org.apache.commons.codec.binary.Base64が必要)
function encodeBase64(data_bytes) {
  var Base64 = org.apache.commons.codec.binary.Base64;
  var b64_bytes = Base64.encodeBase64(data_bytes);
  return "" + (new java.lang.String(b64_bytes));
}
function decodeBase64(b64_str) {
  var b64_bytes = (new java.lang.String(b64_str)).getBytes();
  var Base64 = org.apache.commons.codec.binary.Base64;
  var b64_bytes = Base64.decodeBase64(b64_bytes);
  return b64_bytes;
}
function saveText(fname, text, encoding) {
  var osw = new java.io.OutputStreamWriter(
    new java.io.FileOutputStream(fname),
    encoding);
  osw.write(text, 0, text.length);
  osw.close();
}