スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

暗号化/復号化

javaは暗号化復号化のAPIを持っているのでそれに暗号化形式を指定してあげればぽぽいと勝手にしてくれるのは昨日何となくわかった。
(本当アルゴリズムをさらう必要があるんだけどいまは省略。)
今までStringの文字を取得してたんでうまくいかなかったけど、byte型で読み込めることがわかったので、ちょっと楽かなー。
…あ、String型.getByte()でいいのか。

	public String encryp(String data){
		String strre=null;
		 try {
			// 暗号化
			 //引数で指定したアルゴリズムの KeyGenerator オブジェクトを生成。
			 KeyGenerator kg = KeyGenerator.getInstance("AES");
			 //秘密鍵を生成。
			 Key key= kg.generateKey();
			 // 鍵を一次符号化形式で返す
			 //System.out.println(key);
			 
			 //引数で指定した暗号化/復号化変換を実装する Cipher オブジェクトを生成
			 Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
			 //鍵を使用してこの暗号を初期化
			 //ENCRYPT_MODE:データの暗号化 
			 c.init(Cipher.ENCRYPT_MODE, key);
			 //暗号化実行
			 byte encrypted[] = c.doFinal(data.getBytes()); 
			 strre = new String(key.getEncoded())+"\n"+new String(encrypted);
			 
		 } catch (Exception e) {
			 e.printStackTrace();
		 }
		 
		 return strre;
	}
	
	public String cryp(String data){
		String strre=null;
		 try {
			// 復号化
			 //行数を数えれる
			 LineNumberReader lr = new LineNumberReader(new StringReader(data));
			 
			 //データからキーを取得
			 byte[] bkey = lr.readLine().getBytes();
			 int iend = new String(bkey).length()+1;
			 StringBuffer sb = new StringBuffer(data);
			 sb.delete(0, iend);
			 data = sb.substring(0);
			 
			 lr.close();
			 
			 //鍵生成
			 SecretKeySpec key = new SecretKeySpec(bkey, "AES");
			 System.out.println(data);
			 System.out.println(key);

			 //引数で指定した暗号化/復号化変換を実装する Cipher オブジェクトを生成
			 Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
			 //鍵を使用して初期化
			 //DECRYPT_MODE:データの暗号解読
			 c.init(Cipher.DECRYPT_MODE, key);
			 //復号化実行
			 return new String(c.doFinal(data.getBytes())); 
			 
		 } catch (Exception e) {
			 e.printStackTrace();
		 }
		 
		 return strre;
	}

参考元:Cipherについて
うーんまだスパゲッティソースだなあ。暗号化したときに生成したキーを暗号化した文字列とまとめて扱いたいってときにどうしたらいいものかわからない!
サイトを見ても、キーを別のファイルに。。。ってなってるし。
最初の改行までの一行ってしたかったけど、鍵文字列内に改行文字コードと同等の文字がないと限らないしなあ(なんせ毎回かわるもんだし)。
何回か生成して、改行がないときの鍵を使用するようにするか??むだっぽいなー