暗号化した文字を文字列にする方法について

797 views
Skip to first unread message

ロウキル

unread,
Dec 1, 2011, 11:47:05 AM12/1/11
to 日本Androidの会
お世話になっております。
以下のように暗号化した文字列をStringにしようとしています。
byte[] aaa の時点では問題ないと思うのですが、str1 からバイトを取得すると
aaa と bbb で値が全然異なります。

post通信をしたいのでString にしたいのですが、何かいい方法はありますでしょうか?

javax では以下のリンクの方法でいけるようなのですが、android で javax は使えるのでしょうか?
http://d.hatena.ne.jp/kenpoco/20080717/1216291915

以下にソースを添付致します。
どうぞよろしくお願い申し上げます。

-------------------------------------------------------------------------------------------------

public static String GetEncryptedString(){
String strAndroidID = "0123456789012345"; // <-128bitのキー
byte[] keyBytes = strAndroidID.getBytes(); // バイト列に変換
SecretKeySpec sKey = new SecretKeySpec(keyBytes, "AES");
String strData = "暗号化するメッセージ";
Cipher cipher1;
try {
cipher1 = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher1.init(Cipher.ENCRYPT_MODE, sKey);
byte[] aaa = cipher1.doFinal(strData.getBytes());
String str1 = new String(aaa);
byte[] bbb = str1.getBytes();
String str2 =
android.util.Base64.encodeToString(cipher1.doFinal(strData.getBytes()),
android.util.Base64.URL_SAFE);
return str2;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}/* catch (UnsupportedEncodingException e) {
e.printStackTrace();
}*/ catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}

田代透

unread,
Dec 1, 2011, 11:57:34 AM12/1/11
to android-g...@googlegroups.com
packagejavax.crypto
http://developer.android.com/intl/ja/reference/javax/crypto/package-summary.html

これはつかえませんか?


2011年12月2日1:47 ロウキル <rou...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

--
--
Toru Tashiro
toru...@gmail.com

ロウキル

unread,
Dec 1, 2011, 8:36:24 PM12/1/11
to 日本Androidの会
ご連絡頂きまして誠にありがとうございます。
申し訳ございません。javax.cryptoは使用していました。

暗号化自体は出来ているのですが、それをpostするためにBase64の文字列にしたいというのが
最終的な目標なのですが、以下のリンクの2.暗号化されたバイト配列を文字列化する(暗号化文字列を得る)
に記載のあるimport javax.mail.internet.MimeUtility; が使えないかと思い質問しました。
上記MimeUtilityを使用しなくても暗号化した文字を正しくStringに出来る方法があればと思いご質問しました。
http://d.hatena.ne.jp/kenpoco/20080717/1216291915

暗号化した文字(byte[])をBase64にエンコードしてダメでした。
どうぞよろしくお願い致します。


On 12月2日, 午前1:57, 田代透 <toru2...@gmail.com> wrote:
> packagejavax.cryptohttp://developer.android.com/intl/ja/reference/javax/crypto/package-s...
>
> これはつかえませんか?
>
> 2011年12月2日1:47 ロウキル <rouk...@gmail.com>:

> toru2...@gmail.com

andropenguin s

unread,
Dec 1, 2011, 9:14:46 PM12/1/11
to android-g...@googlegroups.com
andropenguinと言います。

http://iharder.sourceforge.net/current/java/base64/

はどうですか。ライセンスがPublic Domainなので、使用しやすいです。

twitter: @andropenguin
HP: http://sarl-tokyo.com/wiki/index.php?Linux%E3%80%81Java%E3%80%81Android%E3%80%81%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E6%8A%80%E8%A1%93%E3%83%8E%E3%83%BC%E3%83%88

2011年12月2日10:36 ロウキル <rou...@gmail.com>:

nagamatu

unread,
Dec 1, 2011, 9:40:47 PM12/1/11
to 日本Androidの会
Google Market Licensing packageには、Apache v2ライセンスの Base64のソースコードが含まれていま
す。

extras/google/market_licensing/library/src/com/android/vending/
licensing/util/Base64.java

--

On Dec 2, 11:14 am, andropenguin s <andropeng...@gmail.com> wrote:
> andropenguinと言います。
>
> http://iharder.sourceforge.net/current/java/base64/
>
> はどうですか。ライセンスがPublic Domainなので、使用しやすいです。
>
> twitter: @andropenguin

> HP:http://sarl-tokyo.com/wiki/index.php?Linux%E3%80%81Java%E3%80%81Andro...
>
> 2011年12月2日10:36 ロウキル <rouk...@gmail.com>:

Shin Miyazaki

unread,
Dec 1, 2011, 10:43:05 PM12/1/11
to android-g...@googlegroups.com
こんにちは、みやざきです。

2011年12月2日1:47 ロウキル <rou...@gmail.com>:

お世話になっております。
以下のように暗号化した文字列をStringにしようとしています。
byte[] aaa の時点では問題ないと思うのですが、str1 からバイトを取得すると
aaa と bbb で値が全然異なります。

Ciper#doFinalの戻り値は文字データでは無くあくまでもバイト列なので、ここで文字列に
する試みがすでに間違っています。
というか、文字列に出来ないデータだとわかってるからBase64化しようとしているのでしょう?
であれば、余計なことをせずaaaを直接Base64化の処理に渡せばいいだけです。

宮山

unread,
Dec 2, 2011, 1:42:50 AM12/2/11
to 日本Androidの会
宮山です。

Base64の処理についてはAPI8(OS2.2)であれば標準ライブラリに入っています。
ターゲットが2.2以降であればこちらを使われた方が良いかと思います。

使い方はこちらのサイトなどをご覧頂ければよいかと思います。
http://d.hatena.ne.jp/akitoh/20110317/1300371204

私が実際にやってる実装はこんな感じです。
(API7で動かす必要があったのでBase64はGoogle Market Licensing package
 のを使ってます)

/**
* 文字列の暗号化
* @param encodeString 暗号化する文字列
* @return 暗号化した文字列
*/
private String encode(String encodeString) {
String result = null;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/
PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, m_baseCipherKey);
byte[] tmp = encodeString.getBytes();
byte[] cipherResult = cipher.doFinal(tmp);
result = Base64.encode(cipherResult);

} catch (Exception e) {
Log.d("cipherMethod = encode", e.getMessage());
}
return result;

ロウキル

unread,
Dec 2, 2011, 6:35:03 AM12/2/11
to 日本Androidの会
お世話になっております。ご回答頂きまして本当にありがとうございました。みやざき様、小宮様のおっしゃる通り、直接Stringにはせず、
Base64にエンコードすることで解決できました。以下のように行いました。
String str = Base64.encodeToString(m_csEncrypted.data,
android.util.Base64.NO_WRAP);
ありがとうございました。

トムキャット

unread,
Dec 3, 2011, 2:03:02 AM12/3/11
to 日本Androidの会
トムキャットです。

postメソッドで使うのでしたら、

URL_SAFE

が必要かも知れません。Base64化した文字列のHTTP送信で過去にはまったことがあります。

Reply all
Reply to author
Forward
0 new messages