A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹善波 中级黑马   /  2012-7-29 00:48  /  2534 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 菠菜(yinshi) 于 2012-7-29 01:15 编辑

/*
复制一个图片并加密,并且只有使用密钥的情况下才能解读
偶然想起毕老师说过一种简单的加密方式,方法是:一个数和同一个数进行两次^运算还是原来的数
所以把一幅图片的数据先和一个整数进行^运算,加密存储,读取的时候在和同一个数进行^运算就能读取;

需求:将一幅图片加密存储,解读的时候必须使用密码才能解读
思路:
1,用字节读取流对象和图片关联。
3,将缓存中的数据进行^运算
2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。
3,通过循环读写,完成数据的存储。
4,关闭资源。

*/
/*本打算用下面的例子做基础,试了几次也没有成功,只好求助大仙们了,有注释更好*/
import java.io.*;
class  CopyPic
{
public static void main(String[] args)
{        
                int key=3;
  FileOutputStream fos = null;
  FileInputStream fis = null;
  try
  {
   fos = new FileOutputStream("c:\\2.bmp");
   fis = new FileInputStream("c:\\1.bmp");
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read(buf))!=-1)
   {
    fos.write(buf,0,len);
   }
  }
  catch (IOException e)
  {
   throw new RuntimeException("复制文件失败");
  }
  finally
  {
   try
   {
    if(fis!=null)
     fis.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
   try
   {
    if(fos!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
我记得老毕说的加密时异或把?^
先异或^a就是加密,然后取出来的时候,再异或原来那个数^a,就是解密啊。
回复 使用道具 举报
楼主的想法甚是好
但是呢看了楼主的程序
就知道了楼主的思路没有打开
需求分析的不够通透
首先这个需求,你应该好好分析这其中的应该拥有的功能
首先要实现的就是加密一个图片文件
这个思路啥的楼主都想到了
但楼主有没有想到你这个文件还要解密
也就是说,你还要编写一个解密程序
不管你是用两个程序来实现这个需求
还是一个程序来实现两个功能
你都需要一个解密程序
另外这个key是不是需要存储到硬盘的一个文件里记录下来
如此一来思路豁然开朗
看楼主的代码,完全有能力写出这个程序来
要是异或不大明白,去看看毕老师讲的异或的原理
相信不久的将来,你能做出这个程序
最后赞一个,楼主学io能想到这个想法实在难得
继续努力!!!
回复 使用道具 举报
本帖最后由 张頔 于 2012-7-29 08:35 编辑

import java.io.*;
class  CopyPic
{
public static void main(String[] args) throws Exception
{        
        int key = 3;
  FileOutputStream fos = null;
  FileOutputStream fos2 = null;
  FileInputStream fis = null;
  try
  {
   fos = new FileOutputStream("c:\\2.jpg");//这个是进行完两次异或,相当于接收端解密的  如图1
   fos2 = new FileOutputStream("c:\\3.jpg");//这个是进行完一次异或,相当于发送前的加密完的 如图2
   fis = new FileInputStream("c:\\1.jpg");
   byte[] buf = new byte[1024];
   int len = 0;
   while((len=fis.read(buf))!=-1)
   {
           for (int i = 0; i < len; i++) {
           buf ^=key ;//每一个字符都进行异或
       }

           fos2.write(buf,0,len);
           fos2.flush();
           for (int i = 0; i < len; i++) {
           buf ^=key ;//同样是每一个字符都进行异或
       }
           fos.write(buf,0,len);
           fos.flush();
   }
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
  finally
  {
   try
   {
    if(fis!=null)
     fis.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("读取关闭失败");
   }
   try
   {
    if(fos!=null)
     fos.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
   try
   {
    if(fos2!=null)
     fos2.close();
   }
   catch (IOException e)
   {
    throw new RuntimeException("写入关闭失败");
   }
  }
}
}

原图.jpg (109.97 KB, 下载次数: 74)

原先的图片的二进制形式

原先的图片的二进制形式

1.jpg (103.87 KB, 下载次数: 75)

第二次异或后的二进制形式

第二次异或后的二进制形式

2.jpg (155.47 KB, 下载次数: 70)

第一次异或后的二进制形式

第一次异或后的二进制形式

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. package forTest;
  2. import java.io.*;

  3. public class Cipher
  4. {

  5. public static void main(String[] args)
  6. {
  7. FileInputStream fis=null;
  8. FileOutputStream fos=null;//定义流引用
  9. int key=3;

  10. try
  11. {
  12. fis=new FileInputStream("F://WOW.jpg");//加密前文件输入流
  13. fos=new FileOutputStream("f://WOW1.jpg");//加密后文件输出流
  14. int buf=-1;
  15. while ((buf=fis.read())!=-1)//因为你的密钥是小于一个字节的int,所以加密的时候要一个字节一个字节的加密.
  16. {
  17. buf=buf^key;// 将读取到的字节异或你的密钥
  18. fos.write(buf);//写到输出流中
  19. fos.flush();
  20. }
  21. } catch (IOException e)
  22. {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. finally
  27. {
  28. try
  29. {
  30. fis.close();//好吧,我承认我有点懒.这里应该分开处理异常
  31. fos.close();

  32. } catch (IOException e)
  33. {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }


  38. }

  39. }
复制代码
加密的原理你已经知道了,所以解密的程序也是这个,不过要将文件名改一下.经测试运行正常.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马