« 例外処理 | トップページ | 砂場遊び »

2011年3月 5日 (土)

暗号の一覧

なんか、最近気の利いたタイトルを思いつかなくなりました。

で、暗号です。今回の場合、ログインするためにIDとパスワードが必要になります。パスワードについては、いくら本体のメモリに格納するとはいえ、平文のまま格納するわけにはいきません。

そこで、暗号化するわけですが、暗号処理を呼び出すのにはそれなりの手続きを踏まないといけないようです。

最終的にはCipherというクラスを使ってデータを暗号化するのですが、この暗号処理を起動するには暗号化(もしくは複合化)鍵が必要になります。
複合化鍵はどうやって作るかというと、KeyFactoryというものを呼び出して、KeySpecというものを指定して作ります。そして、そのKeyFactoryとかKeySpecとかいうものはProviderという中に格納されています。

なんですが、実際には暗号のやり方は何通りもあって、このそれぞれの手順で”どの”暗号を使うのかを具体的に指定する必要があります。自分で作って戻すならAESが使えれば十分なんですけどねぇ。

Developerサイトもよく探したつもりなのですが、具体的にこうすればいいというのが無いんです。例としてあがっている"AES/CFB8/NoPadding"という指定さえ、そんなんしらね。といわれてしまいました。(これは8ビットのストリーム型という指定で、つまり、1バイト平文を入れたら1バイト暗号文が出てくる形式だと思われるのですが)

仕方ないので、一覧を表示するアプリをつくりました。当初、Logで出していたのですが、膨大に出力される上、Typeが混在していてなにがなにやら分からない有様なのでSpinner使ってListを選択できるようにしました。

数時間Eclipse先生とお話して、こんなんでました。やっつけ感たっぷりです。結構長いです。

上のSpinnerがProviderの選択。下のSpinnerがType(KeyFactoryとかAlgolithmとか)の選択です。実際はProviderはBCを見れば十分なのですが、とりあえず、何が入っているのか分かるように全部出してみました。TypeのSpinnerはスクロールするほど項目が多いです。が、それを選択した状態でもリストがスクロールするほど名前があります。

あー、enableFilterすればよかったのかな。 時間ができたら考えます。

public class cipherlist extends ListActivity {

      private final String TAG = "cipherlist";
      
      private Context mContext ;
      private LayoutInflater mInflater ;
      
      private Spinner mProviderSpinner ;
      private Spinner mTypeSpinner ;
      private ListView mListView ;

      private Provider mProviderArray[] ;
      private int mProviderSelected ;
      private String mProviderName ;
      private String mMatchType ;
      private ArrayList<String> mTypeArray ;
      private ArrayList<String> mAlgolithmArray;
      private ArrayList<String> mClassNameArray;
      
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        setContentView(R.layout.cipher);
   
       mContext = getApplicationContext();
      
       mProviderSpinner = (Spinner) findViewById(R.id.spinner1);
       mTypeSpinner = (Spinner) findViewById(R.id.spinner2);
       mListView = (ListView) findViewById(android.R.id.list);
      
            mProviderArray = Security.getProviders();
        ArrayAdapter<Provider> pAdapter = new ProviderSpinnerAdapter<Provider>(mContext,
                  android.R.layout.simple_spinner_dropdown_item, mProviderArray);
       mProviderSpinner.setAdapter(pAdapter);
       mProviderSpinner.setOnItemSelectedListener(mSListener);
    }
    public void onResume() {
      super.onResume();
      
    }
    public void onStart() {
      super.onStart() ;
      
    }
      class ProviderSpinnerAdapter<Provider> extends ArrayAdapter<Provider> {
            Context mContext ;
            LayoutInflater mInflater ;
            int mLayoutId ;
            Provider[] mList;
            public ProviderSpinnerAdapter(Context context, int textViewResourceId,
                        Provider[] objects) {
                  super(context, textViewResourceId, objects);
                  mContext = context ;
                  mInflater = LayoutInflater.from(mContext);
                  mLayoutId = textViewResourceId ;
                  mList = objects;
            }
      public View getDropDownView(int pos,View cv,ViewGroup parent){
            if(cv ==null) {
                  cv = (TextView) mInflater.inflate(mLayoutId, null);
            }
            ((TextView) cv).setText( ((java.security.Provider) mList[pos]).getName());
            return cv;
      }
      }
    private OnItemSelectedListener mSListener = new OnItemSelectedListener(){

            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int pos,
                        long row) {
                  mProviderName = (String) ((TextView)v).getText();
                  mProviderSelected = pos ;
                  Log.d(TAG,"mProviderSelected ="+String.valueOf(mProviderSelected));
                  setup_TypeSpinner();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                  // TODO Auto-generated method stub
                  
            }
      
    };
    private void setup_TypeSpinner(){
      mTypeArray = new ArrayList<String>();
      mAlgolithmArray = new ArrayList<String>();
      Set <Service> ss = mProviderArray[mProviderSelected].getServices();
      Iterator<Service> ite = ss.iterator();
      for (boolean ended = false;!ended;){
            Log.d(TAG,"iterat");
            try {
            Service s = ite.next();
            String type = s.getType();
            mAlgolithmArray.add(s.getAlgorithm());
            boolean found = false ;
            for (String t: mTypeArray){
                  if(t.equals(type)) found = true ;
            }
            if (!found) mTypeArray.add(type);
            } catch (NoSuchElementException nse){
                  ended=true ;
            }
      }
      mTypeSpinner.setAdapter(new ArrayAdapter<String>(mContext,
                  android.R.layout.simple_spinner_dropdown_item, mTypeArray));
      mTypeSpinner.setOnItemSelectedListener(mTListener);
      mListView.setAdapter(new ArrayAdapter<String>(mContext,
                  android.R.layout.simple_list_item_1, mAlgolithmArray){
            
      });
    }
    private OnItemSelectedListener mTListener = new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int pos,
                        long row) {
                  mMatchType = mTypeArray.get(pos);
                  select_list();
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                  // TODO Auto-generated method stub
                  
            }
    };
    private void select_list() {
      mAlgolithmArray = new ArrayList<String> ();
      Set <Service> ss = mProviderArray[mProviderSelected].getServices();
      Iterator<Service> ite = ss.iterator();
      for (boolean ended = false;!ended;){
            Log.d(TAG,"iterat");
            try {
            Service s = ite.next();
            String type = s.getType();
            if (mMatchType.equals(type)) {
                  mAlgolithmArray.add(s.getAlgorithm());
            }
            } catch (NoSuchElementException nse){
                  ended=true ;
            }
      }
      mListView.setAdapter(new ArrayAdapter<String>(mContext,
                  android.R.layout.simple_list_item_1, mAlgolithmArray){
      });
    }
}

« 例外処理 | トップページ | 砂場遊び »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/60027/51041510

この記事へのトラックバック一覧です: 暗号の一覧:

« 例外処理 | トップページ | 砂場遊び »