ASCII码加密解密
1.index.jsp:页面输入用户名和密码,通过form表单提交
<body>
<form method="post" action="./password" name="cookie">
<input type="text" name="name" />
<input type="password" name="password" />
<input type="submit" name="submit" value="GO-->>>">
</form>
</body>
2.PassWordServlet.java
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
Users users = new Users();
// 获取页面传递的参数
users.setUserName(request.getParameter("name"));
users.setPassword(request.getParameter("password"));
UserServer userServer = new UserServer();
// 将页面参数插入到数据库,生成新的一条记录
if (userServer.insert(users) > 0) {// 插入数据库成功
// 根据用户名取得符合条件的用户信息
Users user2 = userServer.getPassWordById(users);
if (user2 != null) {
if (user2.getPassword().equals(users.getPassword())) {
System.out.println("----用戶名/密码正确------------");
// 页面显示查看密码
System.out.println("---"+user2.getUserName());
System.out.println("----"+user2.getPassword());
request.setAttribute("userName", user2.getUserName());
request.setAttribute("passStr", user2.getPassword());
request.getRequestDispatcher("/result.jsp").forward(request,
response);
} else {
System.out.println("----密码错误-----");
response.sendRedirect("./error.jsp");
}
} else {
System.out.println("-----用户不存在-------");
}
}
}
3.UserServer.java:连接数据库,插入/查询一条记录
package com.ginger.text;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserServer implements Serializable {
private static final long serialVersionUID = 1L;
private String insertSQL;
private String getPassWordSQL;
private int flag;
PreparedStatement past;
List list;
ResultSet rs;
Users users;
ConDB db;
// 插入一条记录
public int insert(Users users) {
db = new ConDB();
past = db.getPast(this.getInsertSQL());
try {
past.setString(1, users.getUserName());
// 将用户名和加密后的密码插入到数据库中
past.setString(2, PassWordUtil.Cipher(users.getPassword()));
flag = past.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
// 根据用户名获得用户密码--此处假设用户名是唯一,只取一条记录
public Users getPassWordById(Users userPro) {
Users user = null;
list = new ArrayList();
db = new ConDB();
past = db.getPast(this.getPassWordSQL());
try {
past.setString(1, userPro.getUserName());
rs = past.executeQuery();
while (rs.next()) {
users = new Users();
users.setUser_id(rs.getString("user_id"));
users.setUserName(rs.getString("userName"));
users.setPassword(rs.getString("password"));
list.add(users);
}
if (list.size() > 0) {
user = (Users) list.get(0);
user.setUserName(user.getUserName());
// 获得解密后的密码\
user.setPassword(PassWordUtil.Decipher(user.getPassword()));
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
public String getInsertSQL() {
this.insertSQL = "insert into users (userName,password) values (?,?)";
return insertSQL;
}
public String getPassWordSQL() {
this.getPassWordSQL = "select * from users where userName=?";
return getPassWordSQL;
}
}
4.PassWordUtil:对参数进行加密/解密
package com.ginger.text;
import java.util.Random;
public class PassWordUtil {
// / 加密与解密函数
static String key = "12345678909887654321";
static int MIN_ASC = 32;
static int MAX_ASC = 126;
static int NUM_ASC = MAX_ASC - MIN_ASC + 1;
// 加密函数
public static String Cipher(String sSourceStr) {
String sTemp = "";
int offset, str_len, i, ch;
offset = NumericPassword(key);
//返回一个随机数0<=r<1
Random random = new Random(-1);
//使用单个 long 种子设置此随机数生成器的种子
random.setSeed(offset);
str_len = sSourceStr.length();
//将参数字符串的每一个字符一一取出,进行处理
for (i = 0; i < str_len; i++) {
ch = sSourceStr.charAt(i);
if (ch >= MIN_ASC && ch <= MAX_ASC) {
ch = ch - MIN_ASC;
// 生成序列中的下一个随机数,进行处理
offset = (int) ((NUM_ASC + 1) * random.nextFloat());
ch = ((ch + offset) % NUM_ASC);
ch = ch + MIN_ASC;
sTemp = sTemp + (char) ch;
}
}
return sTemp.replace("'", "''");
}
// 解密函数
public static String Decipher(String sSourceStr) {
String sTemp = "";
int offset;
int str_len;
int i;
int ch;
offset = NumericPassword(key);
Random random = new Random(-1);
random.setSeed(offset);
str_len = sSourceStr.length();
for (i = 0; i < str_len; i++) {
ch = sSourceStr.charAt(i);
if (ch >= MIN_ASC && ch <= MAX_ASC) {
ch = ch - MIN_ASC;
offset = (int) ((NUM_ASC + 1) * random.nextFloat());
ch = ((ch - offset) % NUM_ASC);
if (ch < 0) {
ch = ch + NUM_ASC;
}
ch = ch + MIN_ASC;
// 将Int类型数据根据ASC码转换成相对应的字符
sTemp = sTemp + (char) ch;
}
}
return sTemp;
}
// 根据加密参数,生成
private static int NumericPassword(String cipherText) {
int Value = 0;
int ch = 0;
int shift1 = 0;
int shift2 = 0;
int i, str_len;
str_len = cipherText.length();
for (i = 0; i < str_len; i++) {
ch = cipherText.charAt(i);
Value = Value ^ (ch * 2 * shift1);
Value = Value ^ (ch * 2 * shift2);
shift1 = (shift1 + 7) % 19;
shift2 = (shift2 + 13) % 23;
}
return Value;
}
}