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

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

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

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

Android Studio

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

Q&A

解決済

1回答

639閲覧

C#で暗号化し、android javaで復号化したwavファイルの再生

valval

総合スコア43

C#

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

Android Studio

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

0グッド

0クリップ

投稿2018/06/24 02:44

C#で暗号化し、android javaで復号化したwavファイルを再生したのですが、妙に音が低くなるという現象が起きており、困っています。

暗号化は下記の通りです。

C#

1//開始ボタン 2 private void button2_Click(object sender, EventArgs e) 3 { 4 FileStream sr = new FileStream( 5 openFileDialog1.FileName, FileMode.Open, FileAccess.Read); 6 byte[] buffer = new byte[sr.Length]; 7 sr.Read(buffer, 0, (int)sr.Length); 8 sr.Close(); 9 10 string text=EncryptString1(buffer, textBox1.Text); 11 12 string filepath = openFileDialog1.FileName; 13 14       //元ファイルと同じフォルダに、拡張子のない、同じ名前で保存 15 string[] split = filepath.Split('.'); 16 System.IO.File.WriteAllText(split[0], text); 17 } 18 19 20    //暗号化処理 21 private String EncryptString1(byte[] textbytes, string key) 22 { 23 byte[] keybytes = System.Text.Encoding.UTF8.GetBytes(key); 24 int keybytesmax = keybytes.Length; 25 26 int counter = 0, keycounter = 0; 27 foreach (byte c2 in textbytes) 28 { 29 textbytes[counter++] =(byte)(c2 ^ keybytes[keycounter]); 30 if (++keycounter >= keybytesmax) keycounter = 0; 31 32 } 33 34 return Convert.ToBase64String(textbytes,Base64FormattingOptions.None); 35 36 }

java側の復号化と音の作成、再生は下記の通りです。

java

1 2public class SozaiHukugouka { 3 4 private Activity Main; 5 private AudioTrack audioTrack; 6 private byte[] koukaon; 7 8  //コンストラクタにてAudioTrackの準備処理 9 public SozaiHukugouka(Activity main) 10 { 11 12 int bufSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 13 14 audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, 15 AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM); 16 17 Main=main; 18 hukugouka(R.raw.decision1,0); 19 20 21 22 } 23 24  //暗号・復号化のキーは自己署名 25 public String Key() 26 { 27 PackageManager pm =Main. getPackageManager(); 28 String key=""; 29 try { 30 PackageInfo packageInfo = pm.getPackageInfo(Main.getPackageName(), 31 PackageManager.GET_SIGNATURES); 32 33 34 for (int i = 0; i < packageInfo.signatures.length; i++) { 35 36 Signature signature = packageInfo.signatures[i]; 37 key=signature.toCharsString(); 38 } 39 40 }catch (Exception ex) 41 { 42 43 44 } 45 return key; 46 } 47 48  //復号化処理 49 private void hukugouka(int id,int num) 50 { 51    52 InputStream is = null; 53 BufferedReader br = null; 54 55 StringBuilder sb = new StringBuilder(); 56 57 58 try{ 59 try { 60 Resources res = Main.getResources(); 61 62         //C#で作った拡張子のないファイルを、rawフォルダに入れ、そこで振られたidを指定し、開く 63 is = res.openRawResource(id); 64 65 br = new BufferedReader(new InputStreamReader(is)); 66 String str; 67 68 while((str = br.readLine()) != null){ 69 sb.append(str); 70 } 71 } finally { 72 if (br !=null) br.close(); 73 } 74 } catch (IOException e) { 75 Toast.makeText(Main, "読み込み失敗", Toast.LENGTH_SHORT).show(); 76 } 77 78 79 String angou=sb.toString(); 80 81 try { 82 koukaon=decrypt(angou,Key()); 83 84 } 85 catch (Exception ex) 86 { 87 88 } 89 90 } 91 92//再生 93 public void PlaySound(int koukaonNo) 94 { 95 96 // 再生 97 audioTrack.play(); 98 audioTrack.write(koukaon_flick, 46, koukaon.length-46); 99 100 } 101 102  //復号化 103 public byte[] decrypt(String encrypt,String key) { 104 105 byte[] textbytes= Base64.decode(encrypt,Base64.NO_WRAP); 106 byte[] keybytes=null; 107 108 int textbytelen=textbytes.length; 109 110 111 try{ 112 keybytes= key.getBytes("UTF-8"); 113 114 } 115 catch (Exception ex) 116 { 117 Dialog dialog=new Dialog(Main); 118 dialog.setTitle(ex.toString()); 119 dialog.show(); 120 } 121 int keybytelen=keybytes.length; 122 123 int counter = 0; 124 125 126 int keycounter=0; 127 128 for(counter=0; counter<textbytelen;counter++) 129 { 130 textbytes[counter] = (byte) (textbytes[counter] ^ keybytes[keycounter]); 131 if(++keycounter>=keybytelen)keycounter=0; 132 } 133 return textbytes; 134 } 135} 136

どうすれば、復号化した上で正しい音が出せますか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

復号化したデータと元データを比較したらどうなってるでしょうか

投稿2018/06/24 02:47

y_waiwai

総合スコア87719

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

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

valval

2018/06/24 03:38

ご回答をありがとうございます。 暗号化前のデータ、復号化後のデータをbase64で文字列化し比較したところ、復号化後はなぜか短くなっていました。 内容は正しく出ているので、なぜ短くなったのか、検証してみます。
valval

2018/06/24 03:57

暗号化前のデータ、復号化後のデータをbase64で文字列化し、双方のlengthを比較したところ、同じでした。短く見えていたのは、android studioのlogcatの表示の限界を超えたためでした。
y_waiwai

2018/06/24 04:11

なら、暗号化前の生データをAndroid で再生したらどうなるのか確認ください それで症状が同じと言うなら、暗号化や周辺のコードが原因ではない、ということになるかと思います
valval

2018/06/24 04:42

暗号化前の生データを実機に送って再生したところ、正常に再生されました。 暗号化か、周辺コードに原因があるようです。
valval

2018/06/24 04:56

すみません。自己解決しました。 int bufSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM); を int bufSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT); audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM); としたところ、正しい音が出ました。 生ファイルの形式に対し、アプリ側の再生の設定が間違っていました。 ご協力、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問