desimageencrypt.java

来自「A java class that uses DES to encript im」· Java 代码 · 共 188 行

JAVA
188
字号
// A java class that uses DES to deceript images
//author @ Linda

import javax.swing.JPanel;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.io.IOException;
import javax.swing.JSplitPane;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import java.awt.Color;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;
import java.awt.Image;


public class DESImageEncrypt extends JPanel
{
    public BufferedImage image, modifiedImage;
    private JPanel leftPanel;
    
    public DESImageEncrypt(String fileName)
    {
        JSplitPane imagePane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        
        leftPanel = new JPanel();
        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
        
        leftPanel.setPreferredSize(new Dimension(200,200));
        
        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
        rightPanel.setPreferredSize(new Dimension(200,200));
        
        imagePane.setLeftComponent(leftPanel);
        imagePane.setRightComponent(rightPanel);
        add(imagePane);
        
        int[]rgb=null;
        byte[] rgbBytes=null;
        int width=0,height=0;
      
        BufferedInputStream bis = new BufferedInputStream
                (ClassLoader.getSystemResourceAsStream(fileName));
    
        try
        {
            
            ImageInputStream iis = ImageIO.createImageInputStream(bis);
            ImageReader reader = ImageIO.getImageReaders(iis).next();
            reader.setInput(iis, false);
            image = reader.read(0);
            width=image.getWidth();
            height=image.getHeight();
            
            rgb = new int[width*height];
            image.getRGB(0, 0, width, height, rgb,0, width);
            ByteArrayOutputStream baos= new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);          
            for(int i=0; i<rgb.length; i++)
            {
                dos.writeInt(rgb[i]);
            }
            rgbBytes = baos.toByteArray();
            
           
            leftPanel.add(new DrawImage());
            
           
         
        }
        catch (IOException e)
        {  
            System.out.println("Unable to read file: " + e);
        }
    
        
        try
        {  // generate a secret key for DES
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            SecretKey key = kg.generateKey();
            // create a cipher using ECB or CFB
           // Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            Cipher cipher = Cipher.getInstance("DES/CFB/PKCS5Padding");
            
            // obtain the plaintext
            byte[] plaintext = rgbBytes;
            // initialize cipher for encryption
            cipher.init(Cipher.ENCRYPT_MODE, key);
            // encrypt the plaintext
            byte[] ciphertext = cipher.doFinal(plaintext);
            
            DataInputStream dis = new DataInputStream(new ByteArrayInputStream(ciphertext));
            int[] rgbBytesModified = new int[width*height];
            int index =0;
            int data=0;
             //get the bytes of the image   
            data = dis.readInt();
            rgbBytesModified[0] = data;
            while((dis.available()>0)&&(index<width*height-1))
            {
                index++;
                data = dis.readInt();
                rgbBytesModified[index] = data;
            }
             modifiedImage=new  BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
           
            modifiedImage.setRGB(0, 0, width, height, rgbBytesModified,0, width);
           
            rightPanel.add(new DrawModified());
            
        }
        catch (IOException e)
        {  
            System.out.println("Unable to read file: " + e);
        }
        catch (NoSuchAlgorithmException e)
        {  System.err.println("Encryption algorithm not available: "+e);
        }
        catch (NoSuchPaddingException e)
        {  System.err.println("Padding scheme not available: "+e);
        }
        catch (InvalidKeyException e)
        {  System.err.println("Invalid key: "+e);
        }
        catch (IllegalBlockSizeException e)
        {  System.err.println("Cannot pad plaintext: "+e);
        }
        catch (BadPaddingException e)
        {  System.err.println("Exception with padding: "+e);
        }
    }
    
        
    public static void main(String[] args)
    {  
        JFrame frame = new JFrame("DESImageEncrypt");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DESImageEncrypt image= new DESImageEncrypt("MaggieWalking.gif");
        frame.getContentPane().add(image);
        frame.pack();
        // position the frame in the middle of the screen
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension screenDimension = tk.getScreenSize();
        Dimension frameDimension = frame.getSize();
        frame.setLocation((screenDimension.width-frameDimension.width)/2,
            (screenDimension.height-frameDimension.height)/2);
        frame.setVisible(true);
   }
   
   private class DrawImage extends JPanel
   {
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, 0,0,Color.WHITE, this);
        }
   }
   
   private class DrawModified extends JPanel
   {
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(modifiedImage, 0,0,Color.WHITE, this);
        }
   
   }
   
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?