事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop
ちょっとした暗号化に
Javaで共通鍵暗号方式「AES」を使用した暗号化と復号化
を参考にstaticなutilメソッドを書いていたのですが、APIをアップデートしたあたりから、
cipher.init(Cipher.ENCRYPT_MODE, key, iv);

Potentially insecure random numbers on Android 4.3 and older. Read https://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html for more info.
とか言われるようになって、????だったので、
AndroidのCipher.java問題 - maru source
開発メモ: Android4.3 で暗号化処理が変わる・・・?
なこともあって、彷徨っていたら
Androidの暗号化ライブラリConcealを使ってみる - Qiita
という記事を見つけたので使ってみた。

build.gradle とか 何のことやらさっぱりわからんのですが、AndroidStudioとかですかね。
BUCK てのはどうやらFaceBookがオープンソース化したビルドツールらしいです。全く知らない世界です。
てなわけで、
Conceal: Documentation
からjarファイル2個と.soファイルを3個頂いて適宜eclipseに入れてこんなコードを書いてみました。

public static String encrypt(Context context, String name, String plainText) {
String strResult = "";
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(context), new SystemNativeCryptoLibrary());
if (crypto.isAvailable()) {
try {
// UTF8でbyte[]に変換して、暗号化する
byte[] cipherText = crypto.encrypt(plainText.getBytes("utf-8"), new Entity(name));
// Base64へエンコード
strResult = Base64.encodeToString(cipherText, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
}
return strResult;
}
public static String decrypt(Context context, String name, String plainText){
String strResult = "";
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(context), new SystemNativeCryptoLibrary());
if (crypto.isAvailable()) {
try {
byte[] byteText = Base64.decode(plainText, Base64.DEFAULT);
// 暗号化されたbyte[]を復号化して、UTF8で文字列に戻す
byte[] decrypted = crypto.decrypt(byteText, new Entity(name));
strResult = new String(decrypted, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
}
return strResult;
}


単に短い文字列(パスワードみたいなもん。今回の用途は違うけど)を暗号化したかったので文字列を入れたら暗号化された文字列を返して(encrypt)、暗号化された文字列を入れたら元の文字列を返す(decrypt)ようにしました。
nameってのは、わかってませんが必要みたいです。keyみたいなもんですかね。
plainTextが暗号化したい文字列 or 暗号化された文字列 です。

まぁ、これで暗号化した文字列をSharedPreferencesとかでファイルに書き出しておくんで、それを覗かれる程度じゃOKなんですけど、nameをベタ書きしとくと微妙なので
Androidで安全にパスワードを保存する(4) | TechRacho
なんかを参考にいろいろと小細工してみました。まぁ、その辺はConcealとは無関係にやってたことですけど。




concealの前に国産のcamelliaてのを試したのですが、
camellia-android -Android JNI wrapper for Camellia encryption library & AES eccryption library - Google Project Hosting
データの暗号化、camellia-androidを試す - Android Advent
camellia-androidはApache License 2.0のようでいいんですけど、本体のcamelliaのライセンスがどうにもよくわからない(マルチプルライセンスとか仰る)のでやめました。

concealはBSD Licenseとハッキリあるので、安心して組み込めそうです。

スポンサーサイト

PageTop
JNI と SQLcipher の共存』の続き。
というか、『armeabi-v7a と x86 についてはどうするか』を調べたよ。というだけです。

Application.mk というのが必要らしい
中身は以下の一行のみ
APP_ABI := armeabi armeabi-v7a x86
APP_ABI := all
としたら
Android NDK: Check that jni/external/arm64-v8a/libdatabase_sqlcipher.so exists or that its path is correct
とかいわれた。
sqlcipherの中に無かったので。



場所はJNI配下で。
applicationmk.png


Android.mkを以下のような感じにする。

include $(CLEAR_VARS)
LOCAL_MODULE := OwnJNISource
LOCAL_SRC_FILES := OwnJNISource.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libdatabase_sqlcipher
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libsqlcipher_android
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libstlport_shared
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

らしいです。
どうやら、$(...)というのが変数みたいなもんらしいです。
てか、端末一個しかないんでいいのかよくわかってないんですけど・・・・
まー公式のドキュメント読め。と;;;

詳しい説明は以下参照
Android NDK の使用とapkファイルへの入れ方
.[ Android ] 自分でコンパイルした既存のビルド済みの複数の共有ライブラリ(lib***.so)を使う方法。 Android.mk の設定が必要
複数ターゲットのプレビルドの共有ライブラリをリンクしたい | 車輪の再発見みたいな?
帰ってきたネコブログ » Application.mk
穀風: Android NDK でデフォルトディレクトリを jni 以外にする方法

PageTop
最近javaばっか触ってます。
組み合わせ作りたいなーと思った時に、なんかしらんけどいつぞや作ったコードがあったので乗っけておこう。すぐ何処に書いたか忘れちゃうから。
まーアルゴリズムなことなんでjava関係ないですが。
なんかスマートじゃない気がソコハカトナクするんですけど・・・
深さが決まってる時は、for(int i=0; i<ilength; i++){ for(int j=i+1; j<jlength; j++){~~とかやっちゃうんだけど、引数で任意にしたかったので再帰です。
数学とか忘れました。
重複を許さない組み合わせです。
どうやって思いついたんだかわからんけど;;
staticとか当然関係ないです。HashSet使ったらよかったんちゃう?


private static void testCombinationReculsion(){
ArrayList<ArrayList<Integer>> resultsList = new ArrayList<>();
ArrayList<Integer> seeds = new ArrayList<>();
seeds.add(1);
seeds.add(2);
seeds.add(3);
seeds.add(4);
seeds.add(5);
seeds.add(6);
seeds.add(7);
seeds.add(8);
seeds.add(9);

//使い方
int m = 3;
combination(resultsList, new ArrayList<Integer>(), seeds, 0, m-1, 0);

for(ArrayList<Integer> menbers : resultsList){
for(int menber : menbers){
System.out.print(menber + ",");
}
System.out.println();
}
}

private static void combination(ArrayList<ArrayList<Integer>> resultList, ArrayList<Integer> combList, ArrayList<Integer> seeds, int nest, int depth, int startI){
ArrayList<Integer> tempList = new ArrayList<>(combList);
for(int i=startI; i<seeds.size()-depth+startI; i++){
if(i>=seeds.size()){continue;}
combList = new ArrayList<>(tempList);
combList.add(seeds.get(i));
if(nest < depth){
combination(resultList, combList, seeds, nest+1, depth, i+1);
}else if(nest >= depth){
resultList.add(combList);
}
}
}


前々から思ってたけど、syntaxhighlighterいれたいなー。どうやるんだろ。
めんどいからいいや。

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。