آموزش رمزگذاری (Encryption) بروی ویدیو در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش رمزگذاری (Encryption) بروی ویدیو در اندروید می پردازیم قبلا آموزش های مرتبطی با رمزگذاری (Encryption) قرار داده بودیم در امروز بروی ویدیو رمزگذاری می کنیم و برای اینکه بتوانیم از آن دوباره نیز استفاده کنیم باید آن را رمزگشایی کنیم تا قابل استفاده باشد در ادامه با ما همراه باشید تا نحوه رمزگذاری (Encryption) و رمزگشایی (Decryption) را بروی ویدیو یاد گیرید ما از رمزگذاری AES که در تلگرام استفاده شده است استفاده می کنیم.
در اندروید برای رمزگذاری بروی فایلی که حدودا 6 مگابایت باشد حدودا 10 ثانیه لازم است ولی می توان از کتاب خانه هایی مانند ffmpeg برای سرعت بخشیدن به این کار استفاده کرد بعدا آموزشی مربوط به ffmpeg را قرار خواهیم داد.
ابتدا یک layout ایجاد می کنیم و در آن دو دکمه قرار میدهیم نام layout ما برابر با activity_main.xml است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <Button android:id="@+id/main_encrypt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="147dp" android:text="Encrypt" /> <Button android:id="@+id/main_decrypt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/main_encrypt" android:layout_centerVertical="true" android:text="Decrypt" /> </RelativeLayout> |
در بالا دو دکمه قرار گرفته است که یکی برای رمزگذاری و دیگری برای رمزگشایی.
باید وارد فایل AndroidManifest.xml شده و دسترسی زیر را اضافه کنید.
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
دوستان باید از Runtime Permission استفاده کنید در این آموزش ما به آن نمی پردازیم تا کد ها شلوغ نشود ولی باید حتما استفاده شود در غیر اینصورت کدها کار نخواهد کرد.
آموزش RunTime Permission در برنامه نویسی اندروید
دو متد همانند زیر داریم که عمل رمزگذاری و رمزگشایی را انجام میدهند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(filePath); FileOutputStream fos = new FileOutputStream(outPath); SecretKeySpec sks = new SecretKeySpec("Programchi".getBytes(),"AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); CipherOutputStream cos = new CipherOutputStream(fos, cipher); int b; byte[] d = new byte[8]; while ((b = fis.read(d)) != -1) { cos.write(d, 0, b); } cos.flush(); cos.close(); fis.close(); } static void decrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(outPath); FileOutputStream fos = new FileOutputStream(inPath); SecretKeySpec sks = new SecretKeySpec("Programchi".getBytes(),"AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while ((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } |
در دو متد بالا ما از کلید Programchi استفاده کردیم که شما می تونید از هرچیز دیگری به جای آن استفاده کنید در بالا از کلاس Cipher به منظور رمزگذاری و رمزگشایی استفاده کردیم.
در نهایت کل کد همانند زیر خواهد شد (کد مربوط به MainActivity.java).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | public class MainActivity extends Activity { // Original file private static final String filePath = "/sdcard/DCIM/Camera/VID_20140217_144346.mp4"; // Encrypted file private static final String outPath = "/sdcard/DCIM/Camera/encrypt.mp4"; // Encrypted and decrypted files private static final String inPath = "/sdcard/DCIM/Camera/decrypt.mp4"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button encryptButton = (Button) findViewById(R.id.main_encrypt); Button DecryptButton = (Button) findViewById(R.id.main_decrypt); encryptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { encrypt(); Toast.makeText(getApplicationContext(), " Encryption complete ", Toast.LENGTH_SHORT).show(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); DecryptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { decrypt(); Toast.makeText(getApplicationContext(), " finished decrypting ", Toast.LENGTH_SHORT).show(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); } static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(filePath); FileOutputStream fos = new FileOutputStream(outPath); SecretKeySpec sks = new SecretKeySpec("Programchi".getBytes(),"AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); CipherOutputStream cos = new CipherOutputStream(fos, cipher); int b; byte[] d = new byte[8]; while ((b = fis.read(d)) != -1) { cos.write(d, 0, b); } cos.flush(); cos.close(); fis.close(); } static void decrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream(outPath); FileOutputStream fos = new FileOutputStream(inPath); SecretKeySpec sks = new SecretKeySpec("oldfeelwasverynb".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while ((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } } |
این آموزش هم به پایان رسید.
موفق باشید.
ممنون از زحمات شما
خواهش می کنم موفق باشید.
سلام. چطور میشه ویدیویی که انکریپت شده و فقط در نرم افزار خودش پخش میشه رو دیکریپت کرد؟
سلام خسته نباشید
من چطوری میتونم روی فایل اصلی این اتفاقات بیافته یعنی فقط داخل اپ من کاربر بتونه مثلا یک فایل pdf ببینه
و دیگ اون فایل اصلی (رمز گذاری نشده) نمایش داده نشود براش؟؟؟؟؟؟؟؟؟