BouncyCastle を使って暗号化

BouncyCastle を使って Andorid用に暗号化用クラスを書いてみた。
Android 用というのは、暗号化した後の byteandroid.util.Base64URL_SAFE エンコードしたからだ。
android.util.Base64URL_SAFE エンコードは、4 byte区切りで余った末尾に "=" padding が付いてしまった。
URLとして嫌なので取り除くことにした。
Apache commons codecBase64.encodeBase64URLSafeString は末尾に "="padding が付かないのに。。。

import java.io.Serializable;
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import android.util.Base64;
/**
 * AESCipherForAndroid
 */

public final class AESCipherForAndroid implements Serializable{
   private static final String mykey = "1234567890abcdef";
   static{
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
   }

   private Key skey;

   public AESCipherForAndroid(){
      this.skey = new SecretKeySpec(mykey.getBytes(),"AES");
   }
   /**
    * 暗号化
    * @param text クリアテキスト
    * @return 暗号化後、Base64 URL エンコードした文字列
    */

   public final String encrypt(String text){
      try{
      byte
 input = text.getBytes();
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding","BC");
      cipher.init(Cipher.ENCRYPT_MODE,this.skey);
      byte encBytes = new byte[cipher.getOutputSize(input.length)];
      int ctLength = cipher.update(input,0,input.length,encBytes,0);
      cipher.doFinal(encBytes,ctLength);
      return new String(Base64.encode(encBytes,Base64.URL_SAFE)).replaceFirst("==$","");
      }catch(Exception e){
         throw new RuntimeException(e);
      }
   }
   /**
    * 複合化
    * @param data 暗号化 Base64 URL エンコードした文字列
    * @return 複合した文字列
    */

   public final String decrypt(String enctext){
      try{
      byte
 data = Base64.decode(enctext,Base64.URL_SAFE);
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding","BC");
      cipher.init(Cipher.DECRYPT_MODE,this.skey);
      byte decBytes = new byte[cipher.getOutputSize(data.length)];
      int ptLength = cipher.update(data,0,data.length,decBytes,0);
      cipher.doFinal(decBytes,ptLength);
      int len=0;
      for(;len < decBytes.length;len++){
         if (decBytes[len]==0) break;
      }
      byte
 bc = new byte[len];
      System.arraycopy(decBytes,0,bc,0,len);
      return new String(bc);
      }catch(Exception e){
         throw new RuntimeException(e);
      }
   }
}