加密算法--总结
来源:互联网 发布:无敌群发软件 编辑:程序博客网 时间:2024/05/22 17:40
最近在给文件做加密时,遇到一些问题,主要是在加密过程中采用加密输入流遇到的问题,总结成代码如下:
package utils;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import org.apache.commons.io.IOUtils;import org.apache.commons.lang.ArrayUtils;public class Test { protected static MessageDigest messagedigest = null; static { try { messagedigest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * ByteArrayOutputStream版本 * 存在问题:当加密文件比较大时会出现内存溢出的问题 * @param file * @return */ public static String getFileMD5WithByteArrayOutputStream(File file) { FileInputStream in = null; ByteArrayOutputStream out = null; try { in = new FileInputStream(file); out = new ByteArrayOutputStream((int)file.length()); byte[] cache = new byte[1024]; for(int i = in.read(cache);i != -1;i = in.read(cache)){ out.write(cache, 0, i); } messagedigest.update(out.toByteArray()); return changeBase64(messagedigest.digest()); } catch (IOException e) { e.printStackTrace(); } finally{ try { in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * MappedByteBuffer版本 * 存在问题:当文件加密之后,如果删除会出现文件被占用无法删除的错误 * @param file * @return */ public static String getFileMD5WithMappedByteBuffer(File file) { FileInputStream in = null; try { in = new FileInputStream(file); FileChannel ch = in.getChannel(); MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); messagedigest.update(byteBuffer); return changeBase64(messagedigest.digest()); } catch (IOException e) { e.printStackTrace(); } finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * byteBuffer版本 * @param file * @return */ public static String getMD5WithbyteBuffer(File file ){ FileInputStream fis= null; try{ fis= new FileInputStream(file); FileChannel fci= fis.getChannel(); ByteBuffer block= ByteBuffer.allocate(1024); while(fci.position() < fci.size()){ int readLen= fci.read(block); block.flip(); messagedigest.update(ArrayUtils.subarray(block.array(), 0, readLen)); block.clear(); } return changeBase64(messagedigest.digest()); }catch(IOException e){ e.printStackTrace(); } finally{ IOUtils.closeQuietly(fis); } return null; } public static void main(String[] args) { String filePath = "F:\\迅雷下载\\[电影天堂www.dygod.cn].回到未来.[中英双字.1024分辨率].rmvb"; long fileBegin1 = System.currentTimeMillis(); System.out.println("文件加密结果为:"+getMD5WithbyteBuffer(new File(filePath))); long fileEnd1 = System.currentTimeMillis(); System.out.println("文件加密耗时:" + ((fileEnd1 - fileBegin1) / 1000) + "s"); long fileBegin2 = System.currentTimeMillis(); System.out.println("文件加密结果为:"+getFileMD5WithMappedByteBuffer(new File(filePath))); long fileEnd2 = System.currentTimeMillis(); System.out.println("文件加密耗时:" + ((fileEnd2 - fileBegin2) / 1000) + "s"); long fileBegin3 = System.currentTimeMillis(); System.out.println("文件加密结果为:"+getFileMD5WithByteArrayOutputStream(new File(filePath))); long fileEnd3 = System.currentTimeMillis(); System.out.println("文件加密耗时:" + ((fileEnd3 - fileBegin3) / 1000) + "s"); } //------------------------------加密运算---------------------------------- protected static final byte[] encodingTable = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' }; /** * copy base64的算法 * @param data * @return */ public static String changeBase64(byte[] data){ int length = data.length; int modulus = length % 3; int dataLength = (length - modulus); int a1, a2, a3; StringBuffer buffer = new StringBuffer(); for (int i = 0; i < dataLength; i += 3) { a1 = data[i] & 0xff; a2 = data[i + 1] & 0xff; a3 = data[i + 2] & 0xff; buffer.append(encodingTable[(a1 >>> 2) & 0x3f]); buffer.append(encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]); buffer.append(encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]); buffer.append(encodingTable[a3 & 0x3f]); } return buffer.toString(); }}
0 0
- 加密算法总结
- 加密算法总结
- 加密算法--总结
- 加密算法总结
- MD5加密算法总结
- .NET中的加密算法总结
- 加密算法罗列总结对比
- RSA加密算法总结
- Android 数据加密算法总结
- 105.各加密算法总结
- 加密算法的学习总结
- 加密算法的总结
- php加密算法总结
- RSA加密算法总结
- 关于MD5加密算法的总结
- 加密算法
- 加密算法
- 加密算法
- libx264在linux编译报错
- 调用手机相机
- iOS常用设计模式:Category
- 生产库MySQL配置文件my.cnf详解
- python模块paramiko与ssh
- 加密算法--总结
- CURLOPT_HEADER 不可小觑的作用
- Mware虚拟机中的ubuntu硬盘扩容
- Java图片压缩处理
- Redis系列学习(二)客户端操作命令(基于Centos7)
- 设计师配色宝典!教你从零开始学配色(一)
- 开发之工厂模式
- Android 开发系列(3) - native代码调用java代码出现attempt using stale local reference错误及解决办法
- virgo tomcat下载