关键词搜索

源码搜索 ×
×

java简单的文件加密

发布2018-08-29浏览2976次

详情内容

文件加密是建立在文件复制的基础之上,说白了就是将一个文件复制过去,期间加上一些干扰信息,致使文件发生改变,来达到文件加密的效果.

文件解密是根据文件相应的加密,来进行解密.

本次加密是比较简层次的加密,用到了java中字节流,io字节流

io字节流,写的时候需要一个数组,假如这个字节数组大小是100.

复制文件,先读文件,再写文件,我读的时候调用read(byte[] b)方法,可以使用read(byte[] b,st,end);这里假设读进去是20-30.

st代表从数组的第st个写end个字节.

数组剩下的部分我用-128-127的随机数填进去

写的时候把整个数组写进去,到最后如果读出来不够100个,就直接写read(byte[] b,0,len),len代表读的有效字节数.

文件解密:

解密是每次读100个,读的时被加密的文件.

但是写的时候不能全写,因为其中只有20-30是有效的字节,以及最后一行的所有事有效的

因此解密就是写的时候只写20-30.到最后一行,不满100的就全写,因为我加密的时候最后一行如果不满100,我是全读出来的.

附上代码:

  1. package com.info.test.jiami;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileOutputStream;
  8. import java.io.IOException;
  9. import java.util.Arrays;
  10. import java.util.Random;
  11. public class MyEncryption {
  12. private static int start= 20;
  13. private static int size= 100;
  14. private static int stlen= 30;
  15. public static void main(String[] args) {
  16. /* 源文件 */
  17. String path = "F:\\test2\\1.png";
  18. /* 加密文件 */
  19. String path2 = "F:\\test2\\2.png";
  20. /* 解密文件 */
  21. String path3 = "F:\\test2\\3.png";
  22. File file = new File(path);
  23. File file2 = new File(path2);
  24. File file3 = new File(path3);
  25. /* 文件加密 */
  26. // Encry(file, file2);
  27. /* 文件解密 */
  28. Decrypt(file2,file3);
  29. }
  30. /**
  31. * 文件解密
  32. * @param f1
  33. * @param f2
  34. */
  35. private static void Decrypt(File f1, File f2) {
  36. FileInputStream fis = null;
  37. BufferedInputStream bis = null;
  38. int count = 0;
  39. FileOutputStream fos = null;
  40. BufferedOutputStream bos = null;
  41. /* 准备了一个字节数组,将文件读到数组中,读一次,写一次,直到读完 */
  42. byte[] b = new byte[size];
  43. int len = 0;
  44. try {
  45. fis = new FileInputStream(f1);
  46. bis = new BufferedInputStream(fis);
  47. fos = new FileOutputStream(f2);
  48. bos = new BufferedOutputStream(fos);
  49. while((len = bis.read(b))!=-1){
  50. System.out.println(count + "--->" + len + "--->" + Arrays.toString(b));
  51. if(len==size) {
  52. /* 长度是满的时候就写中间的 */
  53. bos.write(b,start,stlen);
  54. }else {
  55. /* 最后一行全写 */
  56. bos.write(b,0,len);
  57. }
  58. count++;
  59. }
  60. } catch (FileNotFoundException e) {
  61. e.printStackTrace();
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. catch (Exception e) {
  66. e.printStackTrace();
  67. }finally {
  68. try {
  69. if (bis != null) {
  70. bis.close();
  71. bis = null;
  72. }
  73. } catch (IOException e) {
  74. e.printStackTrace();
  75. }
  76. try {
  77. if (bos != null) {
  78. bos.close();
  79. bos = null;
  80. }
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }
  86. /**
  87. * 文件加密
  88. * @param f1
  89. * @param f2
  90. */
  91. private static void Encry(File f1, File f2) {
  92. // TODO Auto-generated method stub
  93. FileInputStream fis = null;
  94. BufferedInputStream bis = null;
  95. int count = 0;
  96. FileOutputStream fos = null;
  97. BufferedOutputStream bos = null;
  98. byte[] b = new byte[size];
  99. int len = 0;
  100. try {
  101. fis = new FileInputStream(f1);
  102. bis = new BufferedInputStream(fis);
  103. fos = new FileOutputStream(f2);
  104. bos = new BufferedOutputStream(fos);
  105. while ((len = bis.read(b, start, stlen)) != -1) {
  106. System.out.println(count + "--->" + len + "--->" + Arrays.toString(b));
  107. for (int i = 0; i < start; i++) {
  108. Random random = new Random();
  109. b[i]= (byte) (random.nextInt(256)-128);
  110. }
  111. for (int i = len+start+1; i < size; i++) {
  112. Random random = new Random();
  113. /* 将产生的随机数加到数组中,构成干扰信息 */
  114. b[i]= (byte) (random.nextInt(256)-128);
  115. }
  116. if (len == stlen) {
  117. bos.write(b, 0, size);
  118. } else {
  119. bos.write(b, start, len);
  120. }
  121. count++;
  122. }
  123. bos.flush();
  124. } catch (IOException e) {
  125. e.printStackTrace();
  126. } catch (Exception e) {
  127. e.printStackTrace();
  128. } finally {
  129. try {
  130. if (bis != null) {
  131. bis.close();
  132. bis = null;
  133. }
  134. } catch (IOException e) {
  135. e.printStackTrace();
  136. }
  137. try {
  138. if (bos != null) {
  139. bos.close();
  140. bos = null;
  141. }
  142. } catch (IOException e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. }
  147. }

前边的几个参数是我设置的全局变量,有利于修改加密的起始位置.我设置的时字节数组大小100,从20开始,往后面写30个.

用到的主要是java中的io字节流,不懂复制的可以看下我的另一篇文章,里面讲的是如何复制文件或者文件夹.

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载