简单视频加密【Version2】

IscInfo.ini文件非常容易被修改,所以想出了一个解决办法

在将.k文件转化为.avi格式时,文件流是打开的,此时我们可以修改.k文件尾部的授权次数信息,每次打开视频前检测剩余几次授权,这样就不需要IscInfo.ini这个文件了

加密部分

1、MAC.java不变,获取本地MAC地址

2、MD5.java 略微修改,使之可以加密所有传入的字符串,比如授权次数

//对MAC地址进行MD5加密,生成32位字符串
//提供一个方法String getMD5)
//返回经过MD5加密后的MAC
package org.tree.enc;import java.security.MessageDigest;public class MD5 {//能够加密所有传入的字符串public String getMD5String mac){String RawMessage = null;String MD5Message = null;try{RawMessage = mac;MessageDigest md = MessageDigest.getInstance"MD5");md.updateRawMessage.getBytes));byte[] b = md.digest);StringBuffer temp = new StringBuffer"");forint i = 0 ; i < b.length; i++){int tep = b[i];iftep < 0){tep += 256;}iftep < 16){temp.append"0");}temp.appendInteger.toHexStringtep));}MD5Message = temp.toString);}catchException e){e.printStackTrace);}return MD5Message;}
}

3、EncVideo.java

将MAC添加进视频尾部后,再加入授权次数,使后64位都是加密信息

//加密视频,在视频末尾添加MAC的MD5,生成Result.k文件
//提供一个方法 void encVideoString InPath, String OutPath)
//InPath:需要加密的文件路径 OutPath:输出文件路径
package org.tree.enc;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class EncVideo {public void encVideoString InPath, String OutPath) throws IOException{FileInputStream in  = null;FileOutputStream out = null;try{in = new FileInputStreamInPath);	out = new FileOutputStreamnew FileOutPath+"\\Result.k"));byte[] b = new byte[1024];int temp = 0;whiletemp = in.readb)) != -1){out.writeb);}out.writenew MD5).getMD5new Mac).getMac)).getBytes));//在尾部添加进授权信息out.writenew MD5).getMD5"10").getBytes));}catchException e){e.printStackTrace);}finally{ifin != null){in.close);}ifout != null){out.close);}}}
}

4、UI.java GUI部分不变

解密部分:

1、MAC.java

同加密部分

2、MD5.java

同加密部分 使之加密所有字符串

3、DecVideo.java 

不仅提取出视频尾部MAC,也提取出授权次数

//提取视频中MAC 
//提供一个方法 String getMacMD5String path)
//返回视频中的MAC path:要打开的加密文件的路径
//返回视频尾部的授权次数
package org.tree.pla;import java.io.RandomAccessFile;public class DecVideo {//提取视频内Mac信息public String getMacMD5String path){String VideoMD5 = null;tryRandomAccessFile raf = new RandomAccessFilepath, "r")){long len = raf.length);raf.seeklen-64);byte[] b = new byte[32];raf.readb);VideoMD5 = new Stringb);}catchException e){e.printStackTrace);}return VideoMD5;}//提取视频内授权次数信息public String getVideoCountString path){String VideoCount = null;tryRandomAccessFile raf = new RandomAccessFilepath, "r")){long len = raf.length);raf.seeklen-32);byte[] b = new byte[32];raf.readb);VideoCount = new String b);}catchException e){e.printStackTrace);}return VideoCount;}
}

4、PlayVideo.java

不仅比较MAC, 还要比较剩余授权次数,且如果满足播放条件 ,剩余授权次数-1重新写入视频尾部

//播放视频
//提供两个方法 boolean CompareMD5String path)
//比较视频中的MAC与本地MAC
//void PlayerSting path)
//播放视频
//提供一个类变量 int count 用来标识剩余授权次数
package org.tree.pla;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;public class PlayVideo {//存储MD5加密后的0-10数字用于比较剩余授权次数public static ArrayList<String> ComList = new ArrayList<>);public static void init){forint i = 0 ; i <= 10 ; i ++){ComList.addnew MD5).getMD5i+""));}}//比较视频中MAC与本地MACpublic boolean CompareMacMD5String path){String VideoMD5 = new DecVideo).getMacMD5path);String localMD5 = null;try{localMD5 = new MD5).getMD5new Mac).getMac));}catchException e){e.printStackTrace);}ifVideoMD5.equalslocalMD5)){return true;}else{return false;}}//获取剩余授权次数public int CompareCountMD5String path){String VideoCount = new DecVideo).getVideoCountpath);return ComList.indexOfVideoCount);}public void PlayerString path){ifnew PlayVideo).CompareMacMD5path)){try{FileInputStream in = new FileInputStreampath);FileOutputStream out = new FileOutputStream"C:\\tmp\\isctmp.avi");byte[] tmpb = new byte[1024];int index = 0;whileindex = in.readtmpb)) != -1){out.writetmpb);}in.close);out.close);int count = new PlayVideo).CompareCountMD5path);//如果剩余授权次数>0 播放且次数-1重新写入视频尾部ifcount > 0){RandomAccessFile raf = new RandomAccessFilepath, "rw");long len = raf.length);raf.seeklen-32);String result = count - 1 + "";result = new MD5).getMD5result);raf.writeresult.getBytes));Process pro = Runtime.getRuntime).exec"C:\\Program Files\\Windows Media Player\\wmplayer.exe " + "C:\\tmp\\isctmp.avi");raf.close);}}catchException e){e.printStackTrace);}}}
}

5、UI.java

基本不变 负责GUI

小结

通过上面的方法,一定程度上提高了安全性

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注