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(); }