BouncyCastle を使って Andorid用に暗号化用クラスを書いてみた。
Android 用というのは、暗号化した後の byte を android.util.Base64 で URL_SAFE エンコードしたからだ。
android.util.Base64 の URL_SAFE エンコードは、4 byte区切りで余った末尾に "=" padding が付いてしまった。
URLとして嫌なので取り除くことにした。
Apache commons codec の Base64.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);
}
}
}