暗号化
//元データ
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();
}
0 件のコメント:
コメントを投稿