準備
Eclipse を使っている場合
* 普通にやると「sun.misc.BASE64Encoder」などで、以下「エラー内容」のようなエラーになる
エラー内容
Access restriction: The type BASE64Encoder is not accessible due to restriction on required library C:\Program Files\Java\jre8\lib\rt.jar
対処方法
[1] プロジェクトを右クリックし、[Properties]-[Java Build Path]-[Libraries]-[JRE Library System [JavaSE-1.X]]を選択 [2] 「System Library」で「Workspace default JRE(jreX)」を選択し「Finish」ボタン押下 [3] 「OK」押下 → エラーが消えるはず。
サンプル
CipherHelper.java
import java.io.IOException; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; public class CipherHelper { private final static byte[] EncryptParamters = { 4, 8, -9, 98, 88, -115, 5, -124, -69, 31 }; public static String encrypt(String encryptedValue, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IOException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = CipherHelper.createCipher(Cipher.ENCRYPT_MODE, secretKey); byte[] outputs = cipher.doFinal(encryptedValue.getBytes()); sun.misc.BASE64Encoder base64Encoder = new sun.misc.BASE64Encoder(); return base64Encoder.encodeBuffer(outputs); } public static String decrypt(String decryptedValue, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IOException, IllegalBlockSizeException, BadPaddingException { Cipher cipher = CipherHelper.createCipher(Cipher.DECRYPT_MODE, secretKey); sun.misc.BASE64Decoder base64Decoder = new sun.misc.BASE64Decoder(); byte[] outputs = base64Decoder.decodeBuffer(decryptedValue); return new String(cipher.doFinal(outputs)); } private static Cipher createCipher(int encryptMode, String secretKey) throws NoSuchAlgorithmException, IOException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "DES"); AlgorithmParameters algorithm = AlgorithmParameters.getInstance("DES"); algorithm.init(CipherHelper.EncryptParamters); Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(encryptMode, secretKeySpec, algorithm); return cipher; } }
Main.java
* 使用者public class Main { public static void main(String[] args) { try { String targetValue = "Hellow World!!"; String password = "password"; String encryptedValue = CipherHelper.encrypt(targetValue, password); System.out.println(encryptedValue); String decryptedValue = CipherHelper.decrypt(encryptedValue, password); System.out.println(decryptedValue); } catch (Exception e) { e.printStackTrace(); } } }
出力結果
76DnUa9shrdTrpBE7xTySQ== Hellow World!!
注意
* 今回のソースは、あくまで色々な制約から標準機能しか使えない場合の対処である。 というのも「sun.misc.BASE64Encoder」、「sun.misc.BASE64Decoder」などは、 通常使用するのは避けるべきクラスであるからである(詳細は下記の参考文献を参照のこと)http://www.ilovex.co.jp/blog/system/industrysystem/javabase64.html
http://pentan.info/java/sample/base64.html
従って、下記の関連記事のようにライブラリを使った方がいいと思われる。http://blogs.yahoo.co.jp/dk521123/32780473.html
関連記事
Java暗号化/複合化する ~Apache Commonsを使用した場合~
http://blogs.yahoo.co.jp/dk521123/32780473.htmlJava で暗号化/複合化する ~標準ライブラリを使用した場合~
http://blogs.yahoo.co.jp/dk521123/33640872.htmlBouncyCastleライブラリ ~Java暗号ライブラリ~
http://blogs.yahoo.co.jp/dk521123/33256866.html【トラブル】Java で初回の暗号化/複合化処理に時間が掛かる
http://blogs.yahoo.co.jp/dk521123/36783396.htmlC#