2016-06-24 9 views
0

Я пытаюсь реализовать операцию xor на первых 256 байтах видеофайла, который создает выходной видеофайл, Я хочу, чтобы выходное видео перестало работать, а затем, когда тот же вывод видео передается как вход, должен быть создан другой видеофайл, который должен вести себя как оригинальный. В основном я пытаюсь зашифровать и расшифровать его.Операция XOR на первых 256 байтах видеофайла

import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import org.apache.commons.io.FileUtils; 

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.RandomAccessFile; 

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    TextView text; 
    private String workingPath; 
    File yourFile; 
    File outputFile; 
    Button decryptButton; 
    byte[] buffer; 
    RandomAccessFile raf; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     workingPath = Environment.getExternalStorageDirectory()+""; 
     outputFile = new File(workingPath, "result4.mp4"); 
     yourFile = new File(workingPath, "result5.mp4"); 
     buffer = new byte[256]; 

     try { 
      raf = new RandomAccessFile(yourFile,"rw"); 
      raf.read(buffer); 
      try { 
       Log.d("pos1",raf.getFilePointer()+""); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     // FileUtils.writeByteArrayToFile(new File(workingPath+"/new.mp4"), buffer); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     byte[] outbyte = xor(buffer); 
     text = (TextView)findViewById(R.id.textView); 

     try { 
      raf.seek(0); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      Log.d("pos2",raf.getFilePointer()+""); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      raf.write(outbyte); 
      byte[] arr = new byte[(int) raf.length()]; 
      raf.read(arr); 

      FileOutputStream fileOuputStream = 
        new FileOutputStream(outputFile); 
      fileOuputStream.write(arr); 
      fileOuputStream.close(); 
      //raf.readFully(o); 
      // outputFile = raf; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 



    public static byte[] xor(byte[] a) { 
     int key=11; 
     byte[] result = new byte[a.length]; 

     for (int i = 0; i < a.length; i++) { 
        a[i] = (byte)(a[i]^key); // we need to cast it back into a byte because it was converted to an int by XOR 
       } 

     return result; 
    } 

} 

В приведенном выше коде, оригинальный видео вход (yourFile) также останавливает working.I не знаю, почему

+1

'RAF = новый RandomAccessFile (yourFile, "RW");' ... 'raf.write (outbyte);' Вот почему ... Что вы думаете, что делает? Если вы хотите изменить копию, только тогда не меняйте оригинал. Просто как тот. Это помогло бы вам, если бы вы открыли исходный файл только для чтения. – Fildor

+0

Я не знал, что yourFile пострадает !! – MrRobot9

+1

Но вы ** напишите ** на него. Метод для этого называется _write_. Как вы можете думать, что это ** не ** написано? : D Я не знаю, достаточно ли вы, чтобы знать музыкальные ленты. Но вы просто прослушали первые 5 секунд любимой ленты своей подруги, затем перемотали ленту и записали 5 секунд мусора на той же ленте. Ваш g/f убьет вас! – Fildor

ответ

1

Вы, очевидно, меняется yourFile на raf.write(outbyte); который будет оказывать видео неиграбельной. Это будет записываться в исходный файл.

Вместо этого вы должны написать все байты yourFile до outputFile с первыми 256 модифицированными.

Ознакомьтесь с этим примером.

import java.io.*; 
public class XORTest 
{ 
    public static void main(String args[])throws IOException 
    { 
     RandomAccessFile reader=new RandomAccessFile("a.txt","r"); 
     RandomAccessFile writer=new RandomAccessFile("b.txt","rw"); 
     byte[] buffer = new byte[256]; 

     reader.read(buffer); 
     xor(buffer); 
     writer.write(buffer); 
     while(true) 
     { 
      int o = reader.read(buffer); 
      if(o < 0) 
       break; 
      writer.write(buffer); 

     } 
     writer.close(); 
     reader.close(); 
    } 

    public static byte[] xor(byte[] a) { 
     int key=11; 
     byte[] result = new byte[a.length]; 

     for (int i = 0; i < a.length; i++) { 
        a[i] = (byte)(a[i]^key);      } 

     return result; 
    } 
} 
+0

Спасибо! Отлично работает – MrRobot9