本系统包含五个模块,注冊模块、登录模块、RSA算法模块、DES算法模块、MD5算法模块。

这五个模块每个实现不同的功能。

注冊模块实现将username和password写入文件里,登录模块则负责将其读入而且推断其是否正确。RSA算法模块实现生成密钥对、加密和解密功能。

DES算法模块实现加密和解密功能。MD5算法模块是实现生成摘要的功能。

(1)、首先为注冊界面:

package test;
import javax.swing.*; import java.awt.*;   //导入必要的包
import java.awt.event.*;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.io.IOException; public class regist {
    public static void main(String[] args){
        register a = new register();
       
    }
}
class register extends JFrame {
    JTextField jTextField ;//定义文本框组件
    JPasswordField jPasswordField;//定义password框组件
    
    public register(){
        
        jTextField = new JTextField(12);
        jPasswordField = new JPasswordField(12);
        JLabel jLabel1,jLabel2;
        JPanel jp1,jp2,jp3;
        JButton jb1,jb2; //创建button
        jLabel1 = new JLabel("username");
        jLabel2 = new JLabel("密    码");
        jb1 = new JButton("注冊");
        jb2 = new JButton("取消");
        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();      
        
        jb1.addActionListener(  
             new ActionListener(){  
             public void actionPerformed(ActionEvent e) {  
                 Jb1_actionPerformed();
            }  
        });  
        jb2.addActionListener(  
            new ActionListener(){  
            public void actionPerformed(ActionEvent e) {  
                Jb2_actionPerformed();
            }  
        });
        //设置布局
        this.setLayout(new GridLayout(3,1));
                    
        jp1.add(jLabel1);
        jp1.add(jTextField);//第一块面板加入username和文本框
                    
        jp2.add(jLabel2);
        jp2.add(jPasswordField);//第二块面板加入password和password输入框
                    
        jp3.add(jb1);
        jp3.add(jb2); //第三块面板加入确认和取消
                    
        //jp3.setLayout(new FlowLayout());    //由于JPanel默认布局方式为FlowLayout,所以能够注销这段代码.
        this.add(jp1);
        this.add(jp2);
        this.add(jp3);  //将三块面板加入到登陆框上面
        //设置显示
        this.setBounds(300, 300, 400, 300);
        //this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        this.setVisible(true);
        this.setTitle("用户注冊界面");
        
    }
    //点击注冊时发生的结果
    public void Jb1_actionPerformed( ){
        <span style="font-family:宋体;">//推断username和password是否为空</span>
        if(jTextField.getText().length()== 0){
            JOptionPane.showOptionDialog(this, "username不能为空","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
            
        }
        else if(jPasswordField.getPassword().length== 0){
            JOptionPane.showOptionDialog(this, "password不能为空","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
        }
        if((jTextField.getText().length()!= 0)&&(jPasswordField.getPassword().length!= 0)){
            /*System.out.println(jTextField.getText());
            System.out.println(jPasswordField.getPassword());*/
            String str1=jTextField.getText();
            String user = MD5.getMD5Str(str1);
            char[] str2 = jPasswordField.getPassword();
            String str = String.valueOf(str2);
            String pwd = MD5.getMD5Str(str);
            FileWriter writer;         
            try {            
                writer = new FileWriter("d:/abc.txt");
                writer.write(user);
                writer.write(" ");
                writer.write(pwd);
                writer.flush();             
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            this.dispose();
           // new denglu();//进入登录页面
        }
    }
    
    //点击取消,产生的结果
    public void Jb2_actionPerformed(){
        this.dispose();
       // new index();//进入主页面
    }
                
}

注冊界面如图所看到的,注冊后会在D盘生成一个abc.txt的文件,会将password用MD5加密后再存入文件里。

(2)、第二步为注冊界面:

注冊界面执行和登录页面相似。将username和password输入后,将username和用MD5加密后的password与文件里读取的username和MD5加密后的password进行对照。假设相等则进入算法界面,否则,不能进入。

package test;
import javax.swing.*; import java.awt.*; //导入必要的包
import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; //主函数
public class login {
public static void main(String[] args){
denglu a = new denglu(); }
}
//页面显示内容
class denglu extends JFrame {
JTextField jTextField ;//定义文本框组件
JPasswordField jPasswordField;//定义password框组件 public denglu(){ jTextField = new JTextField(12);
jPasswordField = new JPasswordField(12);
JLabel jLabel1,jLabel2;
JPanel jp1,jp2,jp3;
JButton jb1,jb2; //创建button
jLabel1 = new JLabel("username");
jLabel2 = new JLabel("密 码");
jb1 = new JButton("登录");
jb2 = new JButton("取消");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel(); jb1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
Jb1_actionPerformed();
}
});
jb2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
Jb2_actionPerformed();
}
});
//设置布局
this.setLayout(new GridLayout(3,1)); jp1.add(jLabel1);
jp1.add(jTextField);//第一块面板加入username和文本框 jp2.add(jLabel2);
jp2.add(jPasswordField);//第二块面板加入password和password输入框 jp3.add(jb1);
jp3.add(jb2); //第三块面板加入确认和取消 // jp3.setLayout(new FlowLayout());   //由于JPanel默认布局方式为FlowLayout,所以能够注销这段代码.
this.add(jp1);
this.add(jp2);
this.add(jp3); //将三块面板加入到登陆框上面
//设置显示
this.setBounds(300, 300, 400, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("用户登陆界面");
} //控制登录button的监听器
public void Jb1_actionPerformed( ){
String name = jTextField.getText();
String user = MD5.getMD5Str(name);
//由于password框获取的值是乱码,所以用String.valueOf将他转换成字符串
String password = String.valueOf(jPasswordField.getPassword());
String pwd = MD5.getMD5Str(password);
/*System.out.println("name="+name);
System.out.println("password="+password);*/
//推断username和password是否为空
if(name.length()== 0){
JOptionPane.showOptionDialog(this, "username不能为空","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}else if(password.length() == 0){
JOptionPane.showOptionDialog(this, "password不能为空","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}
//读取文件
if((name.length()!= 0)&&(password.length() != 0)){
try {
Scanner in = new Scanner(new File("d:/abc.txt"));
String str = in.nextLine();
String strr = str.trim();
String[] abc = strr.split("[\\p{Space}]+"); //以空格来分
String str1 = abc[0];//得到的是文件里的username
String str2 = abc[1]; //得到的是文件里的password
if(abc[1] != null){
Pattern p = Pattern.compile("\n");
Matcher m = p.matcher(abc[1]);
str2 = m.replaceAll("");
}
//用来測试查看文件里读取的字符串与表单中的字符串是否相等
/*System.out.println("比較username="+name.equals(str1));
System.out.println("比較password="+password.equals(str2));*/ //推断输入的username与文件里得到的username是否同样
if(user.equals(str1)){ //推断输入的password与文件里得到的password是否同样
if(pwd.equals(str2)){
this.dispose();
new Algorithm();
}else{
JOptionPane.showOptionDialog(this, "password错误","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}
}else{
JOptionPane.showOptionDialog(this, "username错误","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} }
//控制取消button的监听器
public void Jb2_actionPerformed(){
this.dispose();
//new index();//<span style="font-family:宋体;">返回主页面</span>
} }

(3)、RSA算法

(1)设计密钥:

(a) 在离线方式下。先产生两个足够大的强质数p、q;

(b) 令n=p*q。计算欧拉函数f(n)=(p-1)×(q-1);

(c) 选取一个与f(n)互素的奇数e,称e为公开指数。

(d) 依据e×d=1 mod(f(n))。找出d;

(e) 舍弃p和q (但绝不能泄露) ,公开(n,e),公钥;

(f) 保密(n。d) 。私钥。

(2)加密:

对于明文M,用公钥 (n。e) 加密可得到密文C。

 

C = Me mod (n)

(3)解密:

对于密文C,用私钥(n,d)解密可得到明文M。

  M = Cd mod (n)

首先生成公私密钥对的代码:

package test;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*; import javax.swing.*; import java.awt.*; //导入必要的包
import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class rsakeypair { public static void main(String []args)throws Exception { new keypair();
}
} class keypair extends JFrame{
JTextField t1,t2,t3;
JButton b1,b2,b3;
JLabel l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13;
JPanel p1,p2,p3,p4,p5,p6;
public static long p;
public static long q;
public static long e;
public static long d;
public static long n;
public static long m; //求最大公约数
public long gcd(long a,long b) {
long gcd;
if(b==0) gcd=a;
else gcd=gcd(b,a%b);
return gcd;
} public long getd(long e ,long m) {
long value=1;
long d = 0;
for(int i=1;;i++) {
value=i * m+1;
/*System.out.println("value: "+value); */
if((value%e==0)&& (value/e < m)) {
d= value/e;
break;
}
}
return d;
}
//推断是否为素数
public boolean primenumber(long t) {
long k=0;
k=(long)Math.sqrt((double)t);
boolean flag=true;
outer:for(int i=2;i<=k;i++) {
if((t%i)==0) {
flag = false; break outer;
}
}
return flag;
} public keypair(){
t1 = new JTextField(12);
t2 = new JTextField(12);
t3 = new JTextField(12);
b1 = new JButton("生成公钥");
b2 = new JButton("生成私钥");
b3 = new JButton("返回");
l1 = new JLabel("输入p:");
l2 = new JLabel("输入q:");
l3 = new JLabel("输入e:");
l4 = new JLabel();
l5 = new JLabel();
l6 = new JLabel("(");
l7 = new JLabel(",");
l8 = new JLabel(")");
l9 = new JLabel("(");
l10 = new JLabel(",");
l11 = new JLabel(")");
l12 = new JLabel();
l13 = new JLabel();
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel();
p6 = new JPanel(); this.setLayout(new GridLayout(6,1)); p1.add(l1);
p1.add(t1); p2.add(l2);
p2.add(t2); p3.add(l3);
p3.add(t3); p4.add(b1);
p4.add(l6);
p4.add(l4);
p4.add(l7);
p4.add(l12);
p4.add(l8); p5.add(b2);
p5.add(l9);
p5.add(l13);
p5.add(l10);
p5.add(l5);
p5.add(l11); p6.add(b3); b1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B1_actionPerformed(); }
});
b2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B2_actionPerformed();
}
});
b3.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B3_actionPerformed();
}
}); this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5);
this.add(p6);
this.setBounds(300, 300, 400, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("生成密钥对");
}
public void B1_actionPerformed(){
p = Integer.parseInt(t1.getText());
q = Integer.parseInt(t2.getText());
e = Integer.parseInt(t3.getText());
n = p * q ;
m = (p-1)*(q-1);
d = getd(e,m);
String x = String.valueOf(n);
String y = String.valueOf(e); if(!primenumber(p)){
JOptionPane.showOptionDialog(this, "输入p不合法","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}else{
if(!primenumber(q)){
JOptionPane.showOptionDialog(this, "输入q不合法","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}else{
if((e >= m) || (gcd (m,e)!=1)){
JOptionPane.showOptionDialog(this, "输入e不合法","错误信息", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, null, null);
}else{
l4.setText(x);
l12.setText(y);
}
}
} }
public void B2_actionPerformed(){
p = Integer.parseInt(t1.getText());
q = Integer.parseInt(t2.getText());
e = Integer.parseInt(t3.getText());
n = p * q ;
m = (p-1)*(q-1);
d = getd(e,m);
String x = String.valueOf(n);
String y = String.valueOf(d);
l13.setText(x);
l5.setText(y);
} public void B3_actionPerformed(){
this.dispose();
new rsashow();
} }

RSA算法中的加密算法:

package test;

import java.awt.*;   //导入必要的包
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.math.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField; public class rsaencryption {
public static void main (String args[]){
new encryption();
} } class encryption extends JFrame{
JTextField t1,t2,t3;
JButton b1,b2;
JLabel l1,l2,l3,l4;
JPanel p1,p2,p3,p4,p5;
public static BigInteger n ;
public static int e;
public static BigInteger ming; /*
* A測试数据:
* p=13171
* q= 35911
* n = 472983781
* e= 17149
* d=281295349
* 明文:88888888
* 密文:347002949
* qq号:348257309
* qq号加密后:410467256
*/ //加密、解密计算
public BigInteger colum(BigInteger y,BigInteger n,int key) {
BigInteger mul= BigInteger.ONE ;
y = y.remainder(n);
while(key > 0){
if(key %2 == 1){
mul = mul.multiply(y).remainder(n);
}
key = key/2;
y = y.multiply(y).remainder(n);
}
return mul;
} public encryption(){
t1 = new JTextField(12);
t2 = new JTextField(12);
t3 = new JTextField(12);
b1 = new JButton("加密");
b2 = new JButton("返回");
l1 = new JLabel("输入公钥中的第一个数n:");
l2 = new JLabel("输入公钥中的第二个数e:");
l3 = new JLabel("输入明文:");
l4 = new JLabel(); p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel(); this.setLayout(new GridLayout(5,1)); p1.add(l1);
p1.add(t1); p2.add(l2);
p2.add(t2); p3.add(l3);
p3.add(t3); p4.add(b1);
p4.add(l4); p5.add(b2); b1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B1_actionPerformed(); }
});
b2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B2_actionPerformed();
}
}); this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5); this.setBounds(300, 300, 400, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("加密算法");
} public void B1_actionPerformed(){
long a = Integer.parseInt(t1.getText());
long c = Integer.parseInt(t3.getText());
n = BigInteger.valueOf(a);
e = Integer.parseInt(t2.getText());
ming = BigInteger.valueOf(c);
BigInteger secretword=colum(ming,n,e);
String x = String.valueOf(secretword);
l4.setText(x);
} public void B2_actionPerformed(){
this.dispose();
new rsashow();
}
}

RSA算法中解密算法的代码:

package test;

import java.awt.*;   //导入必要的包
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField; public class rsadecrypt {
public static void main (String args[]){
new decrypt();
} } class decrypt extends JFrame{
JTextField t1,t2,t3;
JButton b1,b2;
JLabel l1,l2,l3,l4;
JPanel p1,p2,p3,p4,p5;
public static BigInteger n ;
public static int d;
public static BigInteger mi;
/*
* B測试数据:
p:17327
q:11311
n:195985697
e:73559
d:153728219
明文:88888888
密文:141349150
*/ //加密、解密计算
public BigInteger colum(BigInteger y,BigInteger n,int key) {
BigInteger mul= BigInteger.ONE ;
y = y.remainder(n);
while(key > 0){
if(key %2 == 1){
mul = mul.multiply(y).remainder(n);
}
key = key/2;
y = y.multiply(y).remainder(n);
}
return mul;
} public decrypt(){
t1 = new JTextField(12);
t2 = new JTextField(12);
t3 = new JTextField(12);
b1 = new JButton("解密");
b2 = new JButton("返回");
l1 = new JLabel("输入私钥中的第一个数n:");
l2 = new JLabel("输入私钥中的第二个数d:");
l3 = new JLabel("输入密文:");
l4 = new JLabel(); p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel(); this.setLayout(new GridLayout(5,1)); p1.add(l1);
p1.add(t1); p2.add(l2);
p2.add(t2); p3.add(l3);
p3.add(t3); p4.add(b1);
p4.add(l4); p5.add(b2); b1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B1_actionPerformed(); }
});
b2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
B2_actionPerformed();
}
}); this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5); this.setBounds(300, 300, 400, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("解密算法");
} public void B1_actionPerformed(){
long a = Integer.parseInt(t1.getText());
//long b = Integer.parseInt(t2.getText());
long c = Integer.parseInt(t3.getText());
n = BigInteger.valueOf(a);
d = Integer.parseInt(t2.getText());
mi = BigInteger.valueOf(c);
BigInteger word=colum(mi,n,d);
String x = String.valueOf(word);
l4.setText(x);
} public void B2_actionPerformed(){
this.dispose();
new rsashow();
}
}

(4)、DES算法

package test;

//加密随机类
import java.security.SecureRandom; //提供加密和解密加密
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.swing.*; import java.awt.*; //导入必要的包
import java.awt.event.*; public class destest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自己主动生成的方法存根
//待加密内容
/* String str = "kale123456789";
//密码。长度要是8的倍数
String password = "12345678";
byte[] result = null;
try{
result = DES.desLock(str.getBytes(),password);
System.out.println("加密后内容为:"+new String(result));
}
catch(Exception e){
System.out.println("加密失败。");
} //解密
try {
byte[] unLockResult = DES.desUnclock(result, password);
System.out.println("解密后内容为:"+new String(unLockResult));
}
catch (Exception e1) {
//e1.printStackTrace();
System.out.println("密钥错误。无法解密!");
}*/
new desshow();
} } class desshow extends JFrame{
JTextField t1,t2;
JButton b1,b2,b3;
JLabel l1,l2,l3,l4,l5,l6;
JPanel p1,p2,p3,p4,p5;
public desshow(){
t1 = new JTextField(12);
t2 = new JTextField(12);
b1 = new JButton("加密");
b2 = new JButton("解密");
b3 = new JButton("返回");
l1 = new JLabel("输入明文:");
l2 = new JLabel("输入密钥:");//加密密钥和解密密钥(加密密钥和解密密钥是一样的)
l3 = new JLabel("加密后的结果:");
l4 = new JLabel();
l5 = new JLabel("解密后的结果:");
l6 = new JLabel(); p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel();
p4 = new JPanel();
p5 = new JPanel(); this.setLayout(new GridLayout(5,1)); p1.add(l1);
p1.add(t1);
p2.add(l2);
p2.add(t2); p3.add(b1);
p3.add(l3);
p3.add(l4); p4.add(b2);
p4.add(l5);
p4.add(l6); p5.add(b3); b1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
J1_actionPerformed();
}
});
b2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
J2_actionPerformed();
}
});
b3.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
J3_actionPerformed();
}
}); this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5);
this.setBounds(100, 100, 300, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("des算法");
}
//待加密内容
String str ;
//密码,长度要是8的倍数
String password ;
public byte[] result = null;
public void J1_actionPerformed(){
str = t1.getText();
password = t2.getText(); try{
result = DES.desLock(str.getBytes(),password);
//System.out.println("加密后内容为:"+new String(result));
l4.setText(new String(result));
}
catch(Exception e){
//System.out.println("加密失败!");
l4.setText("加密失败");
}
}
//byte[] result2= DES.desLock(str.getBytes(),password);
public void J2_actionPerformed(){
try {
byte[] unLockResult = DES.desUnclock(result, password);
//System.out.println("解密后内容为:"+new String(unLockResult));
l6.setText(new String(unLockResult));
}
catch (Exception e1) {
//e1.printStackTrace();
//System.out.println("密钥错误,无法解密!");
l6.setText("密钥错误。无法解密。");
}
}
public void J3_actionPerformed(){
this.dispose();
new Algorithm();
}
} /*
* DES加密介绍
DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用同样密钥的算法。 DES加密算法出自IBM的研究。后来被美国政府正式採用,之后開始广泛流传,可是近些年使用越来越少。
由于DES使用56位密钥,以现代计算能力。24小时内就可以被破解。尽管如此,在某些简单应用中,我们还是可
以 使用DES加密算法,本文简单解说DES的JAVA实现。
*/
class DES{ /**
* 加密过程,密钥长度都必须是8的倍数
* @param datasource
* @param password
* @return 加密后的结果
*/
public static byte[] desLock(byte[] datasource, String password) {
try{
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个密匙工厂。然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完毕加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//如今。获取数据并加密
//正式运行加密操作
return cipher.doFinal(datasource);
}catch(Throwable e){
e.printStackTrace();
}
return null;
} /**
* 解密过程,密钥长度都必须是8的倍数
* @param src
* @param password
* @return 解密后的内容
* @throws Exception
*/
public static byte[] desUnclock(byte[] src, String password) throws Exception {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完毕解密操作
Cipher cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正開始解密操作
return cipher.doFinal(src);
} }

(5)、MD5算法

package test;

import javax.swing.*;

import java.awt.*;   //导入必要的包
import java.awt.event.*;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import javax.swing.JTextField; /*
* 数据:helloworld
* 摘要:38a57032085441e7
* qq号:348257309
* * qq号加密后:410467256
* */
public class md5test { /**
* @param args
*/
public static void main(String[] args) {
/* String password = "123456789";
String result = MD5.getMD5Str(password);
System.out.println(result.toLowerCase());*/
new md5show();
} } class md5show extends JFrame{
JTextField jTextField = new JTextField(12);
JLabel jl1,jl2 ;
JPanel p1,p2,p3;
JButton j1,j2;
public md5show(){ jl1= new JLabel("请输入要生成摘要的数据:");
jl2 =new JLabel();
p1 = new JPanel();
p2 = new JPanel();
p3 = new JPanel(); this.setLayout(new GridLayout(3,1));
p1.add(jl1);
p1.add(jTextField); j1 = new JButton("生成摘要");
j2 = new JButton("返回");
p2.add(j1);
p2.add(jl2); p3.add(j2); j1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
J1_actionPerformed();
}
});
j2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
J2_actionPerformed();
}
});
this.add(p1);
this.add(p2);
this.add(p3);
this.setBounds(300, 300, 400, 300);
//this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);
this.setTitle("MD5算法"); } public void J1_actionPerformed(){
String password = jTextField.getText();
String result = MD5.getMD5Str(password);
jl2.setText(result.toLowerCase());
}
public void J2_actionPerformed(){
this.dispose();
new Algorithm();
} } class MD5 {
/*
* MD5加密
*/
public static String getMD5Str(String str) {
MessageDigest messageDigest = null; try {
messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(str.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException caught!");
System.exit(-1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} byte[] byteArray = messageDigest.digest(); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
//16位加密,从第9位到25位
return md5StrBuff.substring(8, 24).toString().toUpperCase();
}
}

源码:

http://download.csdn.net/detail/bluedream1219/8906279

password技术应用设计实践-安全信息传输系统(SITS)(用Java实现DES、RSA、MD5算法)的更多相关文章

  1. (转)EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  2. EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  3. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  4. 腾讯技术分享:微信小程序音视频与WebRTC互通的技术思路和实践

    1.概述 本文来自腾讯视频云终端技术总监rexchang(常青)技术分享,内容分别介绍了微信小程序视音视频和WebRTC的技术特征.差异等,并针对两者的技术差异分享和总结了微信小程序视音视频和WebR ...

  5. XPages访问关系型数据库技术与最佳实践

    XPage 对于 Domino 开发人员的一大好处就是能够很方便和高效的访问关系型数据库.本文通过实例代码展现了在 XPage 中访问关系型数据库的具体步骤 , 同时讲解了一些在 XPage 中高效访 ...

  6. QQ会员活动运营平台架构设计实践——高效自动化运营

    QQ会员活动运营平台(AMS),是QQ会员增值运营业务的重要载体之一,承担海量活动运营的Web系统.在过去四年的时间里,AMS日请求量从200-500万的阶段,一直增长到日请求3-5亿,最高CGI日请 ...

  7. 大数据分析的下一代架构--IOTA架构设计实践[下]

    大数据分析的下一代架构--IOTA架构设计实践[下] 原创置顶 代立冬 发布于2018-12-31 20:59:53 阅读数 2151  收藏 展开 IOTA架构提出背景 大数据3.0时代以前,Lam ...

  8. Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|

    内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...

  9. 高德AR & 车道级导航技术演进与实践

    2020云栖大会于9月17日-18日在线上举行,阿里巴巴高德地图携手合作伙伴精心组织了"智慧出行"专场,为大家分享高德地图在打造基于DT+AI和全面上云架构下的新一代出行生活服务平 ...

随机推荐

  1. [NOIP 2010] 引水入城

    搜索+贪心. 参考博客:http://blog.sina.com.cn/s/blog_8442ec3b0100xib1.html 主要是要看出来,如果有解的话,每个沿湖城市能够流到的范围是连续的区间. ...

  2. js判断对象为空

    http://www.jb51.net/article/42713.htm var isEmptyValue = function(value) { var type; if(value == nul ...

  3. springcloud+eureka简单入门案例

    springcloud+eureka简单入门案例 一.服务提供者 直接提供服务,入门案例没有特别要设置的地方,注意下端口,由于要启动多个服务,可能会冲突 配置文件(src/main/resources ...

  4. 【C++】继承时构造函数和析构函数

    1. 顺序 先调用基类的构造函数,再调用派生类构造函数.析构顺序相反. 2. 构造函数 派生类 不用初始化列表调用基类构造函数->调用基类的默认构造函数 派生类 使用初始化列表调用基类带参构造函 ...

  5. Juel Getting Started

    Getting Started The JUEL distribution contains the following JAR files: juel-api-2.2.x.jar - contain ...

  6. mySQL的存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  7. tomcat并发优化

    配置参考 <Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192& ...

  8. 输入数字n,按顺序打印出从1到最大的n位十进制数

    题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的999. 跳进面试官的陷阱 void PrintfToMaxNDigits(int n) { ; ; ...

  9. Django项目静态文件加载失败问题

    在我们平时的开发过程中,为了方便调试程序,我们都是打开开发者模式,即Debug=True,当我们正式上线的时候肯定就需要把开发者模式关掉,用uwsgi部署上去以后,突然发现我们平时辛苦做的项目的静态文 ...

  10. python3图片验证码识别

    http://my.cnki.net/elibregister/CheckCode.aspx每次刷新该网页可以得到新的验证码进行测试 以我本次查看的验证码图片为例,右键保存图片为image.jpg 下 ...