【Java】Java で暗号化/複合化する ~標準ライブラリを使用した場合~

準備

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.html

Java で暗号化/複合化する ~標準ライブラリを使用した場合~

http://blogs.yahoo.co.jp/dk521123/33640872.html

BouncyCastleライブラリ ~Java暗号ライブラリ~

http://blogs.yahoo.co.jp/dk521123/33256866.html

【トラブル】Java で初回の暗号化/複合化処理に時間が掛かる

http://blogs.yahoo.co.jp/dk521123/36783396.html
C#

共有キー暗号方式 ~暗号化編~

http://blogs.yahoo.co.jp/dk521123/30818470.html