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 + -
显示快捷键?