質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2449閲覧

android javaで、平文を暗号化後、復号化すると、平文にない文字が入る

kbys32

総合スコア55

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2018/04/15 12:14

編集2018/04/16 11:05

お世話になります。

前提・実現したいこと

平文自体をキーにして暗号化するプログラムを書いたのですが、なぜか失敗します。

発生している問題・エラーメッセージ

暗号文を復号化した時、先頭と末尾に、平文に無い妙な文字が紛れています。
それ以外は正常に復号化されています。

該当のソースコード

暗号化は下記の通りです。
暗号文はシェアードプレファレンスに保存しています。

java

1 2private void angouka(String hirabun) 3{ 4 byte[] hirabunBytes=null; 5 try { 6 hirabunBytes = hirabun.getBytes("UTF-8"); 7 }catch (Exception e) 8 { 9 10 } 11 int num0; 12 for(int num=0;num<3;num++) 13 { 14 for(num0=1;num0<hirabunBytes.length-1;num0++) 15 { 16 hirabunBytes[num0]=(byte)(hirabunBytes[num0]^ hirabunBytes[num0-1]); 17 } 18 hirabunBytes[0]=(byte)( hirabunBytes[0] ^ hirabunBytes[hirabunBytes.length-1] ); 19 20 } 21 SharedPreferences sharedPreferences=getSharedPreferences("data",MODE_PRIVATE); 22 23 SharedPreferences.Editor editor= sharedPreferences.edit(); 24 25 editor.putString("data", Base64.encodeToString(hirabunBytes,Base64.NO_WRAP)).apply(); 26}

復号化は下記の通りです。暗号文はシェアードプレファレンスから引っ張り出してきます。

java

1 SharedPreferences sharedPreferences=getSharedPreferences("data",MODE_PRIVATE); 2 String saveddata=sharedPreferences.getString("data",""); 3 4 if(!saveddata.equals("")) 5 { 6 int counter0; 7 byte[] textbytes=Base64.decode(saveddata,Base64.NO_WRAP); 8 int textbytelen=textbytes.length; 9 String ret=""; 10 for(int counter=0;counter<3;counter++) 11 { 12 textbytes[0]=((byte)(textbytes[textbytelen-1] ^ textbytes[0])); 13 for(counter0=textbytelen-1;counter0>=1 ;counter0--) 14 { 15 textbytes[counter0]=(byte)(textbytes[counter0] ^(textbytes[counter0-1])); 16 } 17 } 18 try{ 19 ret=new String(textbytes,"UTF-8");//このretに復号化された平文が入る、はず。 20 } 21 catch (Exception ex) 22 { 23 24 } 25}

これらのコードで

hogehuga

を暗号化すると、

CWYIY2V7GmE=

となり、これを復号化したところ、

}ehuge

と出ました。中括弧は元の文字にはありませんし、
そこから左側は化け文字になっています。
最後の文字も、平文ではaですが、復号化するとe
になりました。

補足情報(FW/ツールのバージョンなど)

android studio 3.1使用

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/04/15 12:17

それで実際に暗号化、復号した例を載せてください
kbys32

2018/04/16 11:01

ご返事をありがとうございます。実際に暗号化、復号化した例を提示しました。ご確認をお願い致します。
guest

回答1

0

ベストアンサー

System.out.printlnで変数を出力すると分かりますが暗号化するときは変数:num0が1~6なのに、
復号する時は変数:counter0が7~1まで回ります。
修正するだけでしたら、復号部分を以下コードに変更してくださいな。

Java

1for(counter0=textbytelen-2;counter0>=1 ;counter0--) 2{ 3 textbytes[counter0]=(byte)(textbytes[counter0] ^(textbytes[counter0-1])); 4}

こちらの質問Androidでの暗号化と復号ができませんAndroid Keystoreを使って秘匿情報を保持するを参考にライブラリを使用することをお勧めします。あと変数はできるだけ直前で宣言してくださいな。

投稿2018/04/16 11:34

編集2018/04/16 11:36
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kbys32

2018/04/16 13:36

ご指摘の通り、for文の回る数が間違っていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問