您的位置:首页 > 编程语言 > Java开发

Java关于RSA,DES加密解密的图形界面

2016-04-26 07:56 591 查看
//RSA加密解密的图形界面
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class RSA_Encrypt {
/** 指定加密算法为DESede */
private static String ALGORITHM = "RSA";
/** 指定key的大小 */
private static int KEYSIZE = 1024;
/** 指定公钥存放文件 */
private static String PUBLIC_KEY_FILE = "PublicKey";
/** 指定私钥存放文件 */
private static String PRIVATE_KEY_FILE = "PrivateKey";

/**
* 生成密钥对
*/
private static void generateKeyPair() throws Exception {
/** RSA算法要求有一个可信任的随机数源 */
SecureRandom sr = new SecureRandom();
/** 为RSA算法创建一个KeyPairGenerator对象 */
KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM);
/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
kpg.initialize(KEYSIZE, sr);
/** 生成密匙对 */
KeyPair kp = kpg.generateKeyPair();
/** 得到公钥 */
Key publicKey = kp.getPublic();
/** 得到私钥 */
Key privateKey = kp.getPrivate();
/** 用对象流将生成的密钥写入文件 */
ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));
ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));
oos1.writeObject(publicKey);
oos2.writeObject(privateKey);
/** 清空缓存,关闭文件输出流 */
oos1.close();
oos2.close();
}

/**
* 加密方法 source: 源数据
*/
public static String encrypt(String source) throws Exception {
generateKeyPair();
/** 将文件中的公钥对象读出 */
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
Key key = (Key) ois.readObject();
ois.close();
/** 得到Cipher对象来实现对源数据的RSA加密 */
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] b = source.getBytes();
/** 执行加密操作 */
byte[] b1 = cipher.doFinal(b);
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b1);
}

/**
* 解密算法 cryptograph:密文
*/
public static String decrypt(String cryptograph) throws Exception {
/** 将文件中的私钥对象读出 */
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));
Key key = (Key) ois.readObject();
/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder decoder = new BASE64Decoder();
byte[] b1 = decoder.decodeBuffer(cryptograph);
/** 执行解密操作 */
byte[] b = cipher.doFinal(b1);
return new String(b);
}

public static void main(String[] args) throws Exception {

JFrame frame = new JFrame("RSA加密解密");
// Button名称
JButton button1 = new JButton("加密");
JButton button2 = new JButton("解密");
// JTextField名称
final JTextField content = new JTextField();
final JTextField pass = new JTextField();
final JTextField dpass = new JTextField();

// JLabel
JLabel view = new JLabel("明文", JLabel.CENTER);
view.setFont(new java.awt.Font("明文", 1, 15));
view.setOpaque(true);
view.setBackground(Color.WHITE);
view.setForeground(Color.BLACK);

// 画布布局
JPanel contentPane = new JPanel();
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(content);
contentPane.add(pass);
contentPane.add(dpass);
contentPane.add(view);
frame.setContentPane(contentPane);
contentPane.setLayout(null);

// 大小设置
view.setBounds(250, 0, 80, 30);
content.setBounds(50, 0, 200, 30);
pass.setBounds(50, 50, 200, 30);
button1.setBounds(250, 50, 80, 30);
dpass.setBounds(50, 100, 200, 30);
button2.setBounds(250, 100, 80, 30);
frame.setSize(400, 300);
frame.setVisible(true);

button1.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str1 = content.getText().toString();
try {
pass.setText(encrypt(str1));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

button2.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str2 = content.getText().toString();
try {
dpass.setText(str2);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

}
}




//DES加密解密的图形界面
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.security.Key;

import javax.crypto.Cipher;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
* DES加密和解密工具,可以对字符串进行加密和解密操作 。
*/
public class DesDemo {
/**
* 默认构造方法,使用默认密钥
*/
public DesDemo() throws Exception {
this(strDefaultKey);
}

/**
* 指定密钥构造方法
*
* @param strKey
*            指定的密钥
* @throws Exception
*/
public DesDemo(String strKey) throws Exception {
// Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}

/** 字符串默认键值 */
private static String strDefaultKey = "national";
/** 加密工具 */
private Cipher encryptCipher = null;
/** 解密工具 */
private Cipher decryptCipher = null;

/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
*            需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
*             本方法不处理任何异常,所有异常全部抛出
*/
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
// 把负数转换为正数
while (intTmp < 0) {
intTmp = intTmp + 256;
}
// 小于0F的数需要在前面补0
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}

/**
* 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)
* 互为可逆的转换过程
*
* @param strIn
*            需要转换的字符串
* @return 转换后的byte数组
*/
public static byte[] hexStr2ByteArr(String strIn) throws Exception {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
// 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}

/**
* 加密字节数组
*
* @param arrB
*            需加密的字节数组
* @return 加密后的字节数组
*/
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}

/**
* 加密字符串
*
* @param strIn
*            需加密的字符串
* @return 加密后的字符串
*/
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}

/**
* 解密字节数组
*
* @param arrB
*            需解密的字节数组
* @return 解密后的字节数组
*/
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}

/**
* 解密字符串
*
* @param strIn
*            需解密的字符串
* @return 解密后的字符串
*/
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}

/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
*            构成该字符串的字节数组
* @return 生成的密钥
*/
private Key getKey(byte[] arrBTmp) throws Exception {
// 创建一个空的8位字节数组(默认值为0)
byte[] arrB = new byte[8];
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
// 生成密钥
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}

public static void main(String[] args) {

JFrame frame = new JFrame("DES加密解密");
// Button名称
JButton button1 = new JButton("加密");
JButton button2 = new JButton("解密");
// JTextField名称
final JTextField content = new JTextField();
final JTextField pass = new JTextField();
final JTextField dpass = new JTextField();

// JLabel
JLabel view = new JLabel("明文", JLabel.CENTER);
view.setFont(new java.awt.Font("明文", 1, 15));
view.setOpaque(true);
view.setBackground(Color.GRAY);
view.setForeground(Color.RED);

// 画布布局
JPanel contentPane = new JPanel();
contentPane.add(button1);
contentPane.add(button2);
contentPane.add(content);
contentPane.add(pass);
contentPane.add(dpass);
contentPane.add(view);
frame.setContentPane(contentPane);
contentPane.setLayout(null);

// 大小设置
view.setBounds(250, 0, 80, 30);
content.setBounds(50, 0, 200, 30);
pass.setBounds(50, 50, 200, 30);
button1.setBounds(250, 50, 80, 30);
dpass.setBounds(50, 100, 200, 30);
button2.setBounds(250, 100, 80, 30);
frame.setSize(400, 300);
frame.setVisible(true);

button1.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str1 = content.getText().toString();
try {
pass.setText(new DesDemo().encrypt(str1));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

button2.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str2 = content.getText().toString();
try {
dpass.setText(str2);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

String path = "./jre7/en.jpg";
// 背景图片
ImageIcon background = new ImageIcon(path);
// 把背景图片显示在一个标签里面
JLabel label = new JLabel(background);
// 把标签的大小位置设置为图片刚好填充整个面板
label.setBounds(0, 0, frame.getWidth(), frame.getHeight());
// 把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
JPanel imagePanel = (JPanel) frame.getContentPane();
imagePanel.setOpaque(false);
// 把背景图片添加到分层窗格的最底层作为背景
frame.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));

}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: