当前位置: 首页 > 知识库问答 >
问题:

图像加密

乐正涵忍
2023-03-14

我正在做图像隐写术,如果我输入大于 3 个字符的消息进行加密,则会出现一个异常,即未定义量化表 0x01 并且消息小于 3 个字符,我需要得到一个加密的图像。我认为这是由于 JPEG 格式(我认为在图像字节数组中注入位时,我 hv 破坏了图像的属性和属性)。帮助我,我确定它与元数据有关,但对此知之甚少。

我正在添加代码,我正在做什么?

 Creating_image()
 {
  File f=new File(file.getParent()+"/encrypt.jpg");
    if(file==null)
    {
        JOptionPane.showMessageDialog(rootPane, "file null ho gyi encrypt mein");
    }
      try{

          FileInputStream imageInFile = new FileInputStream(file);
        byte imageData[] = new byte[(int) file.length()];
        imageInFile.read(imageData);


        // Converting Image byte array into Base64 String
        String imageDataString =  Base64.encode(imageData);

        // Converting a Base64 String into Image byte array
        pixels = Base64.decode(imageDataString);

        // Write a image byte array into file system

        imageInFile.close();

        }
        catch(Exception as)
       {
   JOptionPane.showMessageDialog(rootPane,"Please first select an Image");
       }
   String msg=jTextArea1.getText(); 
   byte[] bmsg=msg.getBytes();
   String as=Base64.encode(bmsg);
  bmsg=Base64.decode(as);

    int len=msg.length();
   byte[] blen=inttobyte(len);
 String sd=Base64.encode(blen);
 blen=Base64.decode(sd);
 pixels=encode(pixels,blen,32);
 pixels=encode(pixels,bmsg,64);

 try{



         // Converting Image byte array into Base64 String
       String imageDataString =  Base64.encode(pixels);

        // Converting a Base64 String into Image byte array
        pixels = Base64.decode(imageDataString);
   InputStream baisData = new ByteArrayInputStream(pixels,0,pixels.length);
        image= ImageIO.read(baisData);
 if(image == null)
 {
     System.out.println("imag is empty");
 }
 ImageIO.write(image, "jpg", f);

 }
 catch(Exception s)
 {
    System.out.println(s.getMessage());
    }
 }

这就是编码fxn的样子

byte[] encode(byte [] old,byte[] add,int offset)
{ 
try{    if(add.length+offset>old.length)
{
    JOptionPane.showMessageDialog(rootPane, "File too short");
}
}
catch(Exception d)
{
  JOptionPane.showMessageDialog(rootPane, d.getLocalizedMessage()); 
}
byte no;
    for(int i=0;i<add.length;i++)
    {
        no=add[i];
        for(int bit=7;bit>=0;bit--,++offset)
        {
           int  b=(no>>bit)&1;
            old[offset]=(byte)((old[offset]&0xfe)|b);
        }
    } 
    return old;
 }

共有1个答案

相诚
2023-03-14

你是正确的,因为你打乱了文件的结构。JPEG格式包含高度压缩的数据,以至于没有一个字节直接表示任何像素值。事实上,JPEG甚至不存储像素值,而是存储像素块的DCT系数。

读取文件原始字节的方法仅适用于 BMP 等格式,其中像素直接存储在文件中。但是,您仍然必须跳过前几个字节(标头),其中包含图像的宽度和高度,颜色平面的数量和每像素位数等信息。

如果您想通过修改像素的最低有效位来嵌入您的消息,您必须将实际的像素加载到一个字节数组中。然后,您可以使用< code>encode()方法修改像素。若要将数据保存到文件中,请将字节数组转换为BuffferedImage对象,并使用< code>ImageIO.write()。但是,您必须使用不涉及有损压缩的格式,因为这可能会扭曲像素值,从而破坏您的邮件。无损压缩(或未压缩)的文件格式包括BMP和PNG,而JPEG是有损的。

如果你仍然想做JPEG隐写术,这个过程会更复杂一些,但这个答案几乎涵盖了你需要做的事情。简而言之,您想借用 jpeg 编码器的源代码,因为编写一个编码器非常复杂,需要对整个格式有复杂的理解。编码器会将像素转换为一堆不同的数字(有损步长),并将它们紧凑地存储到文件中。然后,应在这两个步骤之间注入隐写算法,您可以在将数字保存到文件之前修改这些数字。

 类似资料:
  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 “图像”按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重设大小 重新设置图像的大小为它的原始大小。 重设高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 “图像”按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重设大小 重新设置图像的大小为它的原始大小。 重设高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到

  • 您可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入仪表板以进行设计或标识仪表板。 添加一个图像 在仪表板选项卡中,点击 “添加图像”。 在打开对话框中选择图像。 属性 图像的可用属性: 选项 描述 不透明度 设置图像的不透明度。 位置 自定义图像的位置。 大小 自定义图像的大小。 原始大小 将图像重置为其原始大小。 URL 输入 URL 路径以将图像设置为超链接。

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重置大小 重新设置图像的大小为它的原始大小。 重置高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到剪贴板。

  • 您可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入仪表板以进行设计或标识仪表板。 添加一个图像 在仪表板选项卡中,点击 。 在打开对话框中选择图像。 属性 图像的可用属性: 选项 描述 不透明度 设置图像的不透明度。 位置 自定义图像的位置。 大小 自定义图像的大小。 原始大小 将图像重置为其原始大小。 URL 输入 URL 路径以将图像设置为超链接。

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重置大小 重新设置图像的大小为它的原始大小。 重置高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到剪贴板。

  • 您可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入仪表板以进行设计或标识仪表板。 添加一个图像 在仪表板选项卡中,点击 “添加图像”。 在打开对话框中选择图像。 属性 图像的可用属性: 选项 描述 不透明度 设置图像的不透明度。 位置 自定义图像的位置。 大小 自定义图像的大小。 原始大小 将图像重置为其原始大小。 URL 输入 URL 路径以将图像设置为超链接。

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重置大小 重新设置图像的大小为它的原始大小。 重置高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到剪贴板。