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

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

ただいまの
回答率

90.49%

  • C#

    7391questions

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

  • Android Studio

    3777questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 149

valval

score 16

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

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

//開始ボタン
 private void button2_Click(object sender, EventArgs e)
        {
            FileStream sr = new FileStream(
                openFileDialog1.FileName,  FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[sr.Length];
            sr.Read(buffer, 0, (int)sr.Length);
            sr.Close();

           string text=EncryptString1(buffer, textBox1.Text);

            string filepath = openFileDialog1.FileName;

       //元ファイルと同じフォルダに、拡張子のない、同じ名前で保存
            string[] split = filepath.Split('.');
            System.IO.File.WriteAllText(split[0], 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);

        }

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

public class SozaiHukugouka {

    private Activity Main;
    private AudioTrack audioTrack;
    private byte[] koukaon;

  //コンストラクタにてAudioTrackの準備処理
    public SozaiHukugouka(Activity main)
    {

        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);

        Main=main;
            hukugouka(R.raw.decision1,0);



    }

  //暗号・復号化のキーは自己署名
    public String Key()
    {
        PackageManager pm =Main. getPackageManager();
        String key="";
        try {
            PackageInfo packageInfo = pm.getPackageInfo(Main.getPackageName(),
                    PackageManager.GET_SIGNATURES);


            for (int i = 0; i < packageInfo.signatures.length; i++) {

                Signature signature = packageInfo.signatures[i];
                key=signature.toCharsString();
            }

        }catch (Exception ex)
        {


        }
        return key;
    }

  //復号化処理
    private void hukugouka(int id,int num)
    {
   
        InputStream is = null;
        BufferedReader br = null;

        StringBuilder sb = new StringBuilder();


        try{
            try {
                Resources res = Main.getResources();

         //C#で作った拡張子のないファイルを、rawフォルダに入れ、そこで振られたidを指定し、開く
                is = res.openRawResource(id);

                br = new BufferedReader(new InputStreamReader(is));
                String str;

                while((str = br.readLine()) != null){
                    sb.append(str);
                }
            } finally {
                if (br !=null) br.close();
            }
        } catch (IOException e) {
            Toast.makeText(Main, "読み込み失敗", Toast.LENGTH_SHORT).show();
        }


        String angou=sb.toString();

        try {
                        koukaon=decrypt(angou,Key());

        }
        catch (Exception ex)
        {

        }

    }

//再生
    public void PlaySound(int koukaonNo)
    {

            // 再生
            audioTrack.play();
            audioTrack.write(koukaon_flick, 46, koukaon.length-46);

    }

  //復号化
    public  byte[] decrypt(String encrypt,String key) {

        byte[] textbytes= Base64.decode(encrypt,Base64.NO_WRAP);
        byte[] keybytes=null;

        int textbytelen=textbytes.length;


        try{
            keybytes= key.getBytes("UTF-8");

        }
        catch (Exception ex)
        {
            Dialog dialog=new Dialog(Main);
            dialog.setTitle(ex.toString());
            dialog.show();
        }
        int keybytelen=keybytes.length;

        int counter = 0;


        int keycounter=0;

        for(counter=0; counter<textbytelen;counter++)
        {
            textbytes[counter] = (byte) (textbytes[counter] ^ keybytes[keycounter]);
            if(++keycounter>=keybytelen)keycounter=0;
        }
        return textbytes;
    }
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/24 12:38

    ご回答をありがとうございます。

    暗号化前のデータ、復号化後のデータをbase64で文字列化し比較したところ、復号化後はなぜか短くなっていました。

    内容は正しく出ているので、なぜ短くなったのか、検証してみます。

    キャンセル

  • 2018/06/24 12:57

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

    キャンセル

  • 2018/06/24 13:11

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

    キャンセル

  • 2018/06/24 13:42

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

    キャンセル

  • 2018/06/24 13: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);
    としたところ、正しい音が出ました。
    生ファイルの形式に対し、アプリ側の再生の設定が間違っていました。
    ご協力、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    スレッドについて

    http://www.techscore.com/tech/Java/JavaSE/Thread/3/ ここのサイトでスレッドについて調べています。 複数のスレッドが同じオ

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    Javaでの文字コード値取得について

    Javaでutf-8のコード値からunicodeに変換するにはどうすればいいでしょうか? public static void main(String[] args) {

  • 解決済

    Javaでマス当てゲームを作りたい

    前提・実現したいこと Javaで5*5のマス目から当たりを見つけるプログラムを作りたいと考えています。 インターネットで下記のプログラムを見つけ応用できないかと思っています。

  • 解決済

    java リスト 並び替え

    テキストファイルからデータを読み込んで、ソート(金額順)をかけたいのですが、文字列で読み込んでいるため、金額でソートしようとしてもうまくいきません。 テキストデータは(1 H

  • 解決済

    Javaからコマンド入力後Excelファイルダウンロード

    前提・実現したいこと WEBでボタンを押すとコマンドが入力されて、Excelファイルでダウンロードしたい 最終的には、いらないログは除外できる機能が作成できれば 該当

  • 解決済

    マルチスレッドによる計算

    以下のようにマルチスレッドを使ってある数に1を永遠とたすプログラムを組んだのですが、スレッドが切り替わるたびに計算結果がずれてしまいます・・・ 原因と解決方法を教えてください・・

  • 解決済

    Java クラスの追加方法について(テトリス)

    Javaでテトリスの実装をさせているのですが機能として次にくるブロックを表示させる機能追加をしようとしていて別途でnextblockpaenlを作成したのですが(コード2)、コード

同じタグがついた質問を見る

  • C#

    7391questions

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

  • Android Studio

    3777questions

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