この記事は、インテル® デベロッパー・ゾーンに掲載されている「Sample Application: Data Encryption Whitepaper」(http://software.intel.com/en-us/android/articles/sample-application-data-encryption-whitepaper) の日本語参考訳です。
ダウンロード
OpenIconPD.txt [331.9KB] (http://software.intel.com/sites/default/files/openiconpd.txt)
Data_Encryption_App_Abstract.pdf [294KB] (http://software.intel.com/sites/default/files/data-encryption-app-abstract.pdf)
Data_Encryption_App_White_Paper.pdf [393KB] (http://software.intel.com/sites/default/files/data-encryption-app-white-paper.pdf)
source.zip [3.9MB] (http://software.intel.com/sites/default/files/45273-source.zip)
BSD2.0.txt [2.8KB] (http://software.intel.com/sites/default/files/bsd2.0.txt)
CCBY3.0.txt [18KB] (http://software.intel.com/sites/default/files/ccby3.0.txt)
アプリケーション提供元:
インテル コーポレーション SSG
データ暗号化コードと説明
この DataEncrytion アプリケーションには、データ暗号化、プログレスバー、パフォーマンス指標の 3 つの主要な機能があります。
DataEncryption クラス宣言
DataEncryption クラスは標準 Activity クラスを拡張します。ロギング、ダイアログ、UI コンポーネント用のプライベート属性があります。
public class DataEncryption extends Activity { private final String TAG = "SECURITY_DATA_ENCRYPTION"; private final String FLAG_SUC = "SECURITY_DATA_ENCRYPTION_SUCCESSFULLY"; private final String FLAG_FAIL = "SECURITY_DATAENCRYPTION_FAILED"; private Boolean mDoneEncryption = false; private long mTimeTook = 0; ProgressThread progThread; ProgressDialog progDialog; int delay = 40; // 更新ループの遅延 (ミリ秒) int maxBarValue = 200; // 水平プログレスバーの最大値 int typeBar; private Handler mHandler = new Handler(); private String mIndicatorText; private TextView mIndicator; private SDPUtility mUtility; private ImageButton encyptionButton;
onCreate メンバー関数
onCreate メンバー関数は、アクティビティーが作成された後、フレームワークにより呼び出されます。上記の説明のように DataEncryption クラスは Activity クラスを拡張するため、開始したときは Activity のように扱われます。アプリケーションの初期化はここで行われます。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.encryption); mUtility = new SDPUtility(); mHandler.postDelayed(mUpdateTimeTask, 100); mIndicator = (TextView) findViewById(R.id.encryptionIndicator); typeBar = 0; encyptionButton = (ImageButton) findViewById(R.id.encryptionButton); encyptionButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showDialog(typeBar); new Thread(new Runnable() { public void run() { encryptVideo(); ... } catch (Exception e) { Log.d(TAG, "Exception occurs in security encryption test.", e); } }
encrypt() 関数
encrypt 関数は実際のデータ暗号化処理を行います。まず入出力ファイルストリームを作成した後、“AES” 暗号オブジェクトと暗号キーを作成し、最後にデータを入力ファイルストリームから読み込み、暗号化されたデータを出力ファイルストリームに書き込みます。
private void encryptVideo() { FileInputStream fis; try { fis = new FileInputStream(new File("/sdcard/h264.mp4")); File outfile = new File("/sdcard/h264_enc.mp4"); int read = 0; if (!outfile.exists()) outfile.createNewFile(); File decfile = new File("/sdcard/h264_dec.mp4"); if (!decfile.exists()) decfile.createNewFile(); FileOutputStream fos = new FileOutputStream(outfile); FileInputStream encfis = new FileInputStream(outfile); FileOutputStream decfos = new FileOutputStream(decfile); Cipher encipher = Cipher.getInstance("AES"); Cipher decipher = Cipher.getInstance("AES"); KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecretKey skey = kgen.generateKey(); encipher.init(Cipher.ENCRYPT_MODE, skey); CipherInputStream cis = new CipherInputStream(fis, encipher); decipher.init(Cipher.DECRYPT_MODE, skey); CipherOutputStream cos = new CipherOutputStream(decfos, decipher); long start = System.nanoTime(); Log.d("security", String.valueOf(start)); while ((read = cis.read()) != -1) { fos.write((char) read); fos.flush(); } long stop = System.nanoTime(); Log.d("security", String.valueOf(stop)); long seconds = (stop - start) / 1000000000;// 秒 Log.d("security", String.valueOf(seconds)); fos.close(); mTimeTook = seconds; mDoneEncryption = true; } catch (FileNotFoundException e) { // TODO 自動生成キャッチブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成キャッチブロック e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO 自動生成キャッチブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成キャッチブロック e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成キャッチブロック e.printStackTrace(); } }
プログレスバー
大きなデータファイルの暗号化には時間がかかるため、暗号化が完了したときにユーザーに通知するプログレスバーがあると便利です。プログレスバーは異なるスレッドで動作し、「スピナー」および「水平」の 2 つのスタイルがあります。
@Override protected Dialog onCreateDialog(int id) { switch(id) { case 0: // スピナー progDialog = new ProgressDialog(this); progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progDialog.setMessage("encrypting data..."); progThread = new ProgressThread(handler); progThread.start(); return progDialog; case 1: // 水平 progDialog = new ProgressDialog(this); progDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progDialog.setMax(maxBarValue); progDialog.setMessage("encrypting data..."); progThread = new ProgressThread(handler); progThread.start(); return progDialog; default: return null; } } final Handler handler = new Handler() { public void handleMessage(Message msg) { int total = msg.getData().getInt("total"); progDialog.setProgress(total); if (mDoneEncryption){ dismissDialog(typeBar); progThread.setState(ProgressThread.DONE); } } };
パフォーマンス指標
データ暗号化ではパフォーマンスも非常に重要です。DataEncryption アプリケーションは、CPU 使用率、メモリー使用率、費やした合計時間などの重要な指標も示します。
private Runnable mUpdateTimeTask = new Runnable() { public void run() { DecimalFormat df = new DecimalFormat("#.##"); String cpuUsage = df.format(mUtility.readUsage() * 100) + "%"; String memUsage = Long.toString(mUtility.readMem((ActivityManager) getSystemService(ACTIVITY_SERVICE))) + "M"; mIndicatorText = "CPU usage: " + cpuUsage + "\nMemory usage: " + memUsage; if(mDoneEncryption){ mIndicatorText = mIndicatorText + "\nTotal Time Spent: " + mTimeTook + " Seconds"; } mIndicator.setText(mIndicatorText); mHandler.postAtTime(this, SystemClock.uptimeMillis() + 2000); } };
まとめ
この記事で説明したサンプルのようにコードを実装することにより、インテル® プロセッサーを搭載する Android* プラットフォーム向けにデータを暗号化する方法と、基本的な暗号パフォーマンスを測定する方法を素早く理解できます。
著者紹介
Peng Wang
インテル コーポレーションのソフトウェア & ソリューション・グループ (SSG) デベロッパー・リレーション部門 インテル® Atom™ プロセッサー・ハイ・タッチ・ソフトウェア・イネーブリング・チームのメンバー。SSG に入る前は、ウルトラ・モバイル・グループの統合および検証チームを指揮していました。
著作権と商標について
本資料に掲載されている情報は、インテル製品の概要説明を目的としたものです。本資料は、明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず、いかなる知的財産権のライセンスを許諾するものではありません。製品に付属の売買契約書『Intel’s Terms and Conditions of Sale』に規定されている場合を除き、インテルはいかなる責任を負うものではなく、またインテル製品の販売や使用に関する明示または黙示の保証 (特定目的への適合性、商品適格性、あらゆる特許権、著作権、その他知的財産権の非侵害性への保証を含む) に関してもいかなる責任も負いません。
インテルによる書面での合意がない限り、インテル製品は、その欠陥や故障によって人身事故が発生するようなアプリケーションでの使用を想定した設計は行われていません。
インテル製品は、予告なく仕様や説明が変更される場合があります。機能または命令の一覧で「留保」または「未定義」と記されているものがありますが、その「機能が存在しない」あるいは「性質が留保付である」という状態を設計の前提にしないでください。これらの項目は、インテルが将来のために留保しているものです。インテルが将来これらの項目を定義したことにより、衝突が生じたり互換性が失われたりしても、インテルは一切責任を負いません。この情報は予告なく変更されることがあります。この情報だけに基づいて設計を最終的なものとしないでください。
本資料で説明されている製品には、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。
最新の仕様をご希望の場合や製品をご注文の場合は、お近くのインテルの営業所または販売代理店にお問い合わせください。
本資料で紹介されている資料番号付きのドキュメントや、インテルのその他の資料を入手するには、1-800-548-4725 (アメリカ合衆国) までご連絡いただくか、
http://www.intel.com/design/literature.htm を参照してください。
性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。
本資料に含まれるソフトウェア・ソース・コードはソフトウェア・ライセンス契約に基づいて提供されるものであり、その使用および複製はライセンス契約で定められた条件下でのみ許可されます。
Intel、インテル、Intel ロゴ、Intel Atom は、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
© 2012 Intel Corporation. 無断での引用、転載を禁じます。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
添付ファイル | サイズ |
---|---|
openiconpd.txt http://software.intel.com/sites/default/files/article/327641/openiconpd.txt |
331.91KB |
45273-source.zip http://software.intel.com/sites/default/files/article/327641/45273-source.zip |
4.02MB |