AESで暗号化

2013年6月8日土曜日

Android

t f B! P L

暗号化

//元データ
String str1 = "hoge";
String str2 = "foo";
String str3 = "bar";

try {
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

    //鍵準備
    try {
        //鍵ファイルがある場合はファイルから読み込む
        FileInputStream in = openFileInput("key");
        byte[] keybyte = new byte[in.available()];
        in.read(keybyte);
        in.close();
        SecretKeySpec skey = new SecretKeySpec(keybyte,"AES");
        c.init(Cipher.ENCRYPT_MODE, skey);
    } catch(Exception e) {
        //鍵ファイルがない場合はランダムに生成
        KeyGenerator generator = KeyGenerator.getInstance("AES");
        generator.init(256, SecureRandom.getInstance("SHA1PRNG"));
        Key key = generator.generateKey();
        //鍵をファイルに保存
        FileOutputStream out = openFileOutput("key", MODE_PRIVATE);
        out.write(key.getEncoded());
        out.close();
        c.init(Cipher.ENCRYPT_MODE, key);
    }

    //暗号化
    byte[] enc_str1 = c.doFinal(str1.getBytes());
    byte[] enc_str2 = c.doFinal(str2.getBytes());
    byte[] enc_str3 = c.doFinal(str3.getBytes());

    /* 暗号化したデータをbyte[]のままどこかに保存
    Stringとかに変換すると壊れるので注意 */

    //IVを保存
    byte[] iv = c.getIV();
    /* これもbyte[]のままどこかに保存 */

} catch(Exception e) {
    e.printStackTrace();
}

複合化

//暗号化データがbyte[]で enc_str に、IVがbyte[]で iv に格納されている前提 */

//鍵をファイルから取得
byte[] key;
try {
    InputStream is = openFileInput("key");
    key = new byte[is.available()];
    is.read(key);
    is.close();
} catch(IOException e) {
    e.printStackTrace();
}

//複合化
SecretKeySpec keyobj = new SecretKeySpec(key,"AES");
try {
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    IvParameterSpec ips = new IvParameterSpec(iv);
    c.init(Cipher.DECRYPT_MODE, keyobj, ips);
    Log.d("TEST", new String(c.doFinal(enc_str)));
} catch(Exception e) {
    e.printStackTrace();
}

QooQ