編輯:關於Android編程
加密過程:以byte[]形式讀取SD卡上准備好的測試音頻文件,使用AES加密算法加密byte[],再保存覆蓋原音頻文件,此時加密後的音頻文件無法被播放。解密和加密過程原理一樣,解密保存後的音頻文件可以被播放。
代碼:
VoiceEncryptionActivity.java
package com.example.voiceencryption; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class VoiceEncryptionActivity extends Activity implements OnClickListener { private static final String TAG = VoiceEncryptionActivity; private static final String seed = guess; // 種子 private MediaPlayer mPlayer; private Button mPlayButton; private Button mEncryptionButton; private Button mDecryptionButton; private File sdCard = Environment.getExternalStorageDirectory(); private File oldFile = new File(sdCard, recording_old.3gpp); // 音頻文件的路徑,在res aw ecording_old.3gpp中找到音頻文件,再放到外部存儲的根目錄下。用於測試 private FileInputStream fis = null; private FileOutputStream fos = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_voice_encryption); mPlayButton = (Button) findViewById(R.id.playButton); mPlayButton.setOnClickListener(this); mEncryptionButton = (Button) findViewById(R.id.encryptionButton); mEncryptionButton.setOnClickListener(this); mDecryptionButton = (Button) findViewById(R.id.decryptionButton); mDecryptionButton.setOnClickListener(this); } @SuppressWarnings(static-access) @Override public void onClick(View v) { switch (v.getId()) { case R.id.playButton: if (mPlayer != null) { mPlayer.release(); mPlayer = null; } // mPlayer = MediaPlayer.create(this, R.raw.recording_old); boolean isSuccess = true; try { fis = new FileInputStream(oldFile); mPlayer = new MediaPlayer(); mPlayer.setDataSource(fis.getFD()); mPlayer.prepare(); // 去掉會出錯 mPlayer.start(); } catch (FileNotFoundException e) { isSuccess = false; e.printStackTrace(); } catch (IllegalArgumentException e) { isSuccess = false; e.printStackTrace(); } catch (IllegalStateException e) { isSuccess = false; e.printStackTrace(); } catch (IOException e) { isSuccess = false; e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (!isSuccess) Toast.makeText(this, 播放失敗, Toast.LENGTH_SHORT).show(); break; case R.id.encryptionButton: // 加密保存 isSuccess = true; try { fis = new FileInputStream(oldFile); byte[] oldByte = new byte[(int) oldFile.length()]; fis.read(oldByte); // 讀取 byte[] newByte = AESUtils.encryptVoice(seed, oldByte); // 加密 fos = new FileOutputStream(oldFile); fos.write(newByte); } catch (FileNotFoundException e) { isSuccess = false; e.printStackTrace(); } catch (IOException e) { isSuccess = false; e.printStackTrace(); } catch (Exception e) { isSuccess = false; e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } if (isSuccess) Toast.makeText(this, 加密成功, Toast.LENGTH_SHORT).show(); else Toast.makeText(this, 加密失敗, Toast.LENGTH_SHORT).show(); Log.i(TAG, 保存成功); break; case R.id.decryptionButton: // 解密保存 isSuccess = true; byte[] oldByte = new byte[(int) oldFile.length()]; try { fis = new FileInputStream(oldFile); fis.read(oldByte); byte[] newByte = AESUtils.decryptVoice(seed, oldByte); // 解密 fos = new FileOutputStream(oldFile); fos.write(newByte); } catch (FileNotFoundException e) { isSuccess = false; e.printStackTrace(); } catch (IOException e) { isSuccess = false; e.printStackTrace(); } catch (Exception e) { isSuccess = false; e.printStackTrace(); } try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } if (isSuccess) Toast.makeText(this, 解密成功, Toast.LENGTH_SHORT).show(); else Toast.makeText(this, 解密失敗, Toast.LENGTH_SHORT).show(); break; default: break; } } }
package com.example.voiceencryption; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESUtils { public static byte[] encryptVoice(String seed, byte[] clearbyte) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = encrypt(rawKey, clearbyte); return result; } public static byte[] decryptVoice(String seed, byte[] encrypted) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = decrypt(rawKey, encrypted); return result; } private static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance(AES); SecureRandom sr = SecureRandom.getInstance(SHA1PRNG, Crypto); sr.setSeed(seed); kgen.init(128, sr); SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); return raw; } private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec( new byte[cipher.getBlockSize()])); byte[] encrypted = cipher.doFinal(clear); return encrypted; } private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, AES); Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec( new byte[cipher.getBlockSize()])); byte[] decrypted = cipher.doFinal(encrypted); return decrypted; } }
阿法狗讓圍棋突然就被熱議了,鴻洋大神也順勢出了篇五子棋單機游戲的視頻,我看到了就像膜拜膜拜,就學習了一下,寫篇博客梳理一下自己的思路,加深一下印象視頻鏈接:
1.fragment1布局及代碼布局<?xml version=1.0 encoding=utf-8?><RelativeLayout
這篇文章拖了好久了,一直存在草稿箱裡沒有繼續寫,趁今天有空,撸撸完。回想一下,你剛剛學習Android的時候,總會看到一些書上寫著,Android使用的是MVC模式,Ac
WebView是Android 提供的操作網頁的一個組件。用於浏覽網頁及其他Internet資源。這裡總結了一些WebView 的常用接口,和2個小示例程序用於自己開發時