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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Java

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

Android Studio

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

Q&A

解決済

1回答

2405閲覧

C#アプリでPNGを暗号化し、android javaアプリで復号化後、復号化したPNGのBitmapが生成されない

valval

総合スコア43

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Java

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

Android Studio

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

0グッド

1クリップ

投稿2018/03/06 13:10

前提・実現したいこと

C#アプリでPNG画像を暗号化し、android で復号化後、復号化したPNG画像を表示します。

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

android javaで、暗号化されたテキストをrawフォルダに入れ、これをmapというファイル名
にします。
下記コードでmapの読み込みを行い、復号化後、Bitmapを作成しますが、Bitmapを作成する関数でnullが返ります

java

1//rawフォルダからmapの読み込み 2InputStream is = null; 3BufferedReader br = null; 4 5StringBuilder sb = new StringBuilder(); 6 7try{ 8 try { 9 Resources res = this.getResources(); 10 is = res.openRawResource(R.raw.map); 11 br = new BufferedReader(new InputStreamReader(is)); 12 String str; 13 14 while((str = br.readLine()) != null){ 15 sb.append(str); 16 } 17 } finally { 18 if (br !=null) br.close(); 19 } 20} catch (IOException ex) { 21 Dialog dialog=new Dialog(this); 22 dialog.setTitle(ex.toString()); 23 dialog.show(); 24} 25 26String angou=sb.toString(); 27Bitmap mapGraphic=null; 28 29//復号化とBitmapの作成 30try { 31 byte[] mapgraphicbyte=decrypt(angou,key);//復号化 これは成功する 32 if (mapgraphicbyte != null) { 33 mapGraphic = BitmapFactory.decodeByteArray(mapgraphicbyte, 0, mapgraphicbyte.length);//ここでnullが返る 34 } 35}catch (Exception ex){ 36 Dialog dialog=new Dialog(this); 37 dialog.setTitle(ex.toString()); 38 dialog.show(); 39}

該当のソースコード

暗号化処理は下記の通りです。
openFileDialog1でファイルを指定し、button1をクリックすると、元ファイルと同じフォルダに、暗号化されたTXTが格納されます。
暗号化は、textBox1に入力された文字列と元ファイルデータの排他的論理和を取ります。

C#

1 2 private void button1_Click(object sender, EventArgs e) 3 { 4 StreamReader sr = new StreamReader( 5 openFileDialog1.FileName, Encoding.UTF8); 6 7 string text = sr.ReadToEnd(); 8 9 sr.Close(); 10 11 text=EncryptString1(text, textBox1.Text); 12 13 14 System.IO.File.WriteAllText(openFileDialog1.FileName+".txt", text); 15 } 16 17 18 19 private String EncryptString1(string text, string key) 20 { 21 22 23 byte[] textbytes = System.Text.Encoding.UTF8.GetBytes(text); 24 byte[] keybytes = System.Text.Encoding.UTF8.GetBytes(key); 25 int keybytesmax = keybytes.Length; 26 27 int counter = 0, keycounter = 0; 28 foreach (byte c2 in textbytes) 29 { 30 textbytes[counter++] =(byte)(c2 ^ keybytes[keycounter]); 31 if (++keycounter >= keybytesmax) keycounter = 0; 32 33 } 34 35 return Convert.ToBase64String(textbytes,Base64FormattingOptions.None); 36 37 } 38 }

復号化は、下記の通りです。

java

1public byte[] decrypt(String encrypt,String key) { 2 3 byte[] textbytes= Base64.decode(encrypt,Base64.NO_WRAP); 4 byte[] keybytes= key.getBytes(); 5 int keybytelen=keybytes.length; 6 int textbytelen=textbytes.length; 7 int counter = 0; 8 int keycounter=0; 9 for(counter=0; counter<textbytelen;counter++) 10 { 11 12 textbytes[counter] = (byte) (textbytes[counter] ^ keybytes[keycounter]); 13 if(++keycounter>=keybytelen)keycounter=0; 14 } 15 return textbytes; 16}

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

android studio 3.0.1を使用
C#アプリ作成にはVisual studio2017 communityを使用
実機検証には,Huawei mate9を使用しています。

宜しくお願い致します

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

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

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

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

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

guest

回答1

0

ベストアンサー

stringはあくまでも文字列なのでそれ以外のファイルのバッファには使えません。

private void button1_Click(object sender, EventArgs e) { using(var sr = new FileStream( openFileDialog1.FileName, Encoding.UTF8, FileMode.Open, FileAccess.Read )){ var buffer = new byte[sr.Length]; sr.Read(bs, 0, sr.Length); var text=EncryptString1(buffer, textBox1.Text); System.IO.File.WriteAllText(openFileDialog1.FileName+".txt", text); } } private String EncryptString1(byte[] textbytes, string key) { byte[] keybytes = System.Text.Encoding.UTF8.GetBytes(key); int keybytesmax = keybytes.Length; int counter = 0, keycounter = 0; foreach (byte c2 in textbytes) { textbytes[counter++] =(byte)(c2 ^ keybytes[keycounter]); if (++keycounter >= keybytesmax) keycounter = 0; } return Convert.ToBase64String(textbytes,Base64FormattingOptions.None); } }

投稿2018/03/06 15:20

編集2018/03/06 15:59
asm

総合スコア15147

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

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

valval

2018/03/07 11:51

動作を確認できました。 ご回答、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問