转自 http://fkuman.blog.163.com/blog/static/698454320078103503258/
通过网络传输信息在日常生活和工作中已变得非常重要了,但也存在不可避免的危险。例如通过网络传输的有价值的信息经常会被拦截或窃取。这时人们选择了加密技术,加密过的信息即使被别人窃取,也不会显示真实的内容。运行本实例,在“标题”文本框中输入“字符串加密!”,在“内容”文本框中输入“加密:密文=明文 异或 密钥”,如下图所示。
字符串加密
单击“留言”按钮,将出现如下图所示的页面提示信息。
这时加密后的内容已经保存到指定数据表“tb_jm_str”中了。如下图所示。
加密后的字符串
当我们点击“返回”按钮回到初始页面中,在“标题”文本框中输入“字符串加密!”,如下图所示。
点击“查看”按钮,即可看到刚才输入的内容,如下图所示。
技术要点
本实例采用的加密算法是变换法。将用户输入的字符串表示为明文,加密后的内容表示为密文。算法如下:
加密:密文=明文 异或 密钥。
解密:明文=密文 异或 密钥。
密钥设置如下:
int key[]={96,44,63,80}
实现过程
(1)新建一个对数据库操作的DB类文件。DB.java代码如下:
package com.safe.DataJM;
import java.sql.*;
public class DB {
private Connection con;
private Statement stm;
private ResultSet rs;
private String classname="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private String url="jdbc:sqlserver://localhost:1433;DatabaseName=db_database15";
public DB(){}
public Connection getCon(){
try{
Class.forName(classname);
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
con=DriverManager.getConnection(url,"admin","123456");
}
catch(Exception e){
e.printStackTrace(System.err);
con=null;
}
return con;
}
public Statement getStm(){
try{
con=getCon();
stm=con.createStatement();
}catch(Exception e){e.printStackTrace(System.err);}
return stm;
}
public Statement getStmed(){
try{
con=getCon();
stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
}catch(Exception e){e.printStackTrace(System.err);}
return stm;
}
public ResultSet search(String sql){
if(sql==null)sql="";
System.out.println("sql:"+sql);
try{
stm=getStmed();
rs=stm.executeQuery(sql);
}
catch(Exception e){e.printStackTrace();}
return rs;
}
public int dosql(String sql){
int num=-1;
if(sql==null)sql="";
try{
stm=getStmed();
num=stm.executeUpdate(sql);
}
catch(Exception e){e.printStackTrace();num=-1;}
return num;
}
public void closed(){
try{
if(rs!=null)rs.close();
}
catch(Exception e){e.printStackTrace();}
try{
if(stm!=null)stm.close();
}
catch(Exception e){e.printStackTrace();}
try{
if(con!=null)con.close();
}
catch(Exception e){e.printStackTrace();}
}
}
(2)创建对字符串进行加密与解密操作的JM类文件。JM.java代码如下:
package com.safe.DataJM;
public class JM {
private String needjam=""; //用户输入的需要被加密的字符串
private String overjam=""; //加密过的字符串
private String needjem=""; //需要被解密的字符串
private String overjem=""; //解密后的字符串
private int key[]={96,44,63,80};
public JM(){}
public void setNeedjam(String needjam){
this.needjam=changeES(needjam);
jam_str();
}
public String getNeedjam(){
return this.needjam;
}
public String getOverjam(){
return this.overjam;
}
public void setNeedjem(String needjem){
this.needjem=needjem;
jem_str();
}
public String getOverjem(){
return this.overjem;
}
private String changeES(String str){
str=str.replaceAll("\r\n","<br>");
str=str.replaceAll(" "," ");
return str;
}
private void jam_str(){
int i=0;
int k=0;
int ikey=0;
int ineedjam=0;
int kn=0;
String temp="";
while(i<this.needjam.length()){
ikey=this.key[k];
ineedjam=(this.needjam).substring(i,i+1).hashCode();
kn=ineedjam^ikey;
temp+=Character.toString((char)kn);
if(k<3)
k+=1;
else
k=0;
i++;
}
this.overjam=temp;
System.out.println("输入的::"+this.needjam);
System.out.println("加密的::"+temp);
}
private void jem_str(){
int i=0;
int k=0;
int ikey=0;
int ineedjem=0;
int kn=0;
String temp="";
while(i<this.needjem.length()){
ikey=this.key[k];
ineedjem=(this.needjem).substring(i,i+1).hashCode();
kn=ineedjem^ikey;
temp+=Character.toString((char)kn);
if(k<3)
k+=1;
else
k=0;
i++;
}
this.overjem=temp;
System.out.println("输入的::"+this.needjam);
System.out.println("加密的::"+this.overjam);
System.out.println("解密的::"+this.overjem);
}
}
(3)创建一个首页面index.jsp,该页面是一个简单的留言板页面。要求用户输入标题和内容。在该页面中用户还可以进行查看留言操作。当用户单击“查看”按钮时,Form表单被提交到show.jsp页面查询并显示相应信息;当用户单击“留言”按钮时,Form表单被提交到dojam.jsp页面进行加密和插入操作。index.jsp代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>字符串加密</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<script type="text/javascript">
function change(linkpage){
document.jmform.action=linkpage;
return true;
}
</script>
<body>
<center>
<form action="dojam.jsp" name="jmform">
<table style="margin-top:100" cellspacing="0" border="1" bordercolor="black" bordercolorlight="black" bordercolordark="white">
<tr>
<td colspan="3" align="center" bgcolor="lightgrey" height="25">
将用户输入的字符串进行加密!
</td>
</tr>
<tr>
<td align="right">标题:</td>
<td><input type="text" name="title" size="25"></td>
<td align="center"><input type="submit" name="search" value="查看" οnclick=change("show.jsp")></td>
</tr>
<tr>
<td align="right">内容:</td>
<td align="center" colspan="2"><textarea name="context" rows="4" cols="25" style="border:1 solid" wrap="hard"></textarea></td>
</tr>
<tr>
<td align="center" colspan="3">
<input type="submit" name="submit" value="留言">
<input type="reset" name="reset" value="重置">
</td>
</tr>
</table>
</form>
</center>
</body>
(4)创建一个dojam.jsp页面。在该页面中调用JM类中的setNeedjam()方法对用户输入的留言内容进行加密后,将其插入到数据库中。其代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="myjm" class="com.safe.DataJM.JM" scope="page"/>
<jsp:useBean id="mydb" class="com.safe.DataJM.DB"/>
<%
String mess="";
boolean mark=true;
String title=request.getParameter("title");
if(title==null)
title="";
title=new String(title.getBytes("ISO-8859-1"),"gbk");
String context=request.getParameter("context");
if(context==null)
context="";
context=new String(context.getBytes("ISO-8859-1"),"gbk");
if(title.equals("")){
mess="<li>请输入<b>留言标题!</b></li><br>";
mark=false;
}
if(context.equals("")){
mark=false;
mess+="<li>请输入<b>留言内容!</b></li>";
}
if(mark){
myjm.setNeedjam(context);
String sql="insert into tb_jm_str values('"+title+"','"+myjm.getOverjam()+"')";
int i=mydb.dosql(sql);
mydb.closed();
if(i>0){
mess="操作成功!";
}
else{
mess="操作失败!";
}
}
%>
<html>
<head>
<title>字符串加密</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<center>
<table width="230" height="70" style="margin-top:100" cellspacing="0" border="1" bordercolor="black" bordercolorlight="black" bordercolordark="white">
<tr bgcolor="lightgrey">
<td align="center">友情提示!</td>
</tr>
<tr>
<td align="center"><%=mess%></td>
</tr>
</table>
<a href="index.jsp">[返回]</a>
</center>
</body>
(5)创建一个show.jsp页面显示用户查询到的留言信息。在该页面中首先从数据库中查询出信息,然后调用JM类中的setNeedjem()方法进行解密后输出。其代码如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*" %>
<jsp:useBean id="myjm" class="com.safe.DataJM.JM" scope="page"/>
<jsp:useBean id="mydb" class="com.safe.DataJM.DB"/>
<html>
<head>
<title>字符串加密</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<center>
<table width="250" height="70" style="margin-top:100" cellspacing="0" border="1" bordercolor="black" bordercolorlight="black" bordercolordark="white">
<tr bgcolor="lightgrey" height="25">
<td align="center" colspan="2">友情提示!</td>
</tr>
<%
boolean mark =true;
ResultSet rs=null;
String mess="";
String title=request.getParameter("title");
if(title==null)
title="";
title=new String(title.getBytes("ISO-8859-1"),"gbk");
if(title.equals("")){
mess="请输入要查看的留言标题!";
mark=false;
}
else{
String sql="select * from tb_jm_str where text_title='"+title+"'";
rs=mydb.search(sql);
if(!rs.next()){
mess="输入的留言标题不存在!";
mark=false;
}
else{
mark=true;
}
}
if(!mark){
%>
<tr><td align="center"><%=mess%></td></tr>
<%}
else{
rs.previous();
while(rs.next()){
String context=rs.getString("text_context");
myjm.setNeedjem(context);
%>
<tr>
<td align="center" bgcolor="lightgrey" height="25">标题:</td>
<td align="center" bgcolor="lightgrey" height="25">内容:</td>
</tr>
<tr>
<td align="center"><%=title %></td>
<td align="left"><%=myjm.getOverjem()%></td>
</tr>
<%
}
mydb.closed();
}
%>
</table>
<a href="index.jsp">[返回]</a>
</center>
</body>
</html>