これらの 2 つの方法は、DB コンテンツの暗号化/復号化に使用されます。
public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");
// Encrypt
byte[] enc = ecipher.doFinal(utf8);
// Encode bytes to base64 to get a string
return Base64.encodeToString(enc, Base64.NO_WRAP);
} catch (javax.crypto.BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}
public String decrypt(String str) {
try {
// Decode base64 to get bytes
byte[] dec = Base64.decode(str, Base64.NO_WRAP);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}
暗号化/復号化された生のバイト配列が同じであることを手動で確認しましたが、どういうわけか、CJK 文字列が破損しています。たとえば、韓国語の「유료컨텐츠는 63」は に文字化けします。元のテキストのスペース文字がすべてを台無しにすることしか考えられませんでした...しかし、それはばかげているように聞こえます。ボット Android デバイスと SQlite ブラウザー UI で同じ文字化けが観察されました。私は一日中 UTF 8 / 16 をいじっていましたが、それが当面の問題に関連しているとは思いません。文字化けした結果は、私の目にはまだ韓国語に見えます... ヒントはありますか?
編集:これは、両方の方法でutf8バイト配列がどのように見えるかです:
[0] -61 [195] [0xc3]
[1] -126 [130] [0x82]
[2] -27 [229] [0xe5]
[3] -116 [140] [0x8c]
[4] -125 [131] [0x83]
[5] -24 [232] [0xe8]
[6] -127 [129] [0x81]
[7] -124 [132] [0x84]
[8] -29 [227] [0xe3]
[9] -66 [190] [0xbe]
[10] -103 [153] [0x99]
[11] -26 [230] [0xe6]
[12] -108 [148] [0x94]
[13] -96 [160] [0xa0]
[14] 54 [0x36]
[15] 51 [0x33]