import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.security.*;
import javax.crypto.*;
public class MyPhoneNum extends HttpServlet {
private static String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish
static boolean debug = false;
static{
Security.addProvider(new com.sun.crypto.provider.SunJCE());
}
//生成密钥, 注意此步骤时间比较长
public static byte[] getKey() throws Exception{
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();
if (debug)
System.out.println("生成密钥:"+byte2hex(deskey.getEncoded()));
return deskey.getEncoded();
}
//加密
public static byte[] encode(byte[] input,byte[] key) throws Exception{
SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key,Algorithm);
if (debug){
System.out.println("加密前的二进串:"+byte2hex(input));
System.out.println("加密前的字符串:"+new String(input));
}
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
byte[] cipherByte=c1.doFinal(input);
if (debug)
System.out.println("加密后的二进串:"+byte2hex(cipherByte));
return cipherByte;
}
//解密
public static byte[] decode(byte[] input,byte[] key) throws Exception{
SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key,Algorithm);
if (debug)
System.out.println("解密前的信息:"+byte2hex(input));
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
byte[] clearByte=c1.doFinal(input);
if (debug){
System.out.println("解密后的二进串:"+byte2hex(clearByte));
System.out.println("解密后的字符串:"+(new String(clearByte)));
}
return clearByte;
}
//md5()信息摘要, 不可逆
public static byte[] md5(byte[] input) throws Exception{
java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); //or "SHA-1"
if (debug){
System.out.println("摘要前的二进串:"+byte2hex(input));
System.out.println("摘要前的字符串:"+new String(input));
}
alg.update(input);
byte[] digest = alg.digest();
if (debug)
System.out.println("摘要后的二进串:"+byte2hex(digest));
return digest;
}
//字节码转换成16进制字符串
public static String byte2hex(byte bytes[]){
StringBuffer retString = new StringBuffer();
for (int i = 0; i < bytes.length; ++i)
{
retString.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase());
}
return retString.toString();
}
//将16进制字符串转换成字节码
public static byte[] hex2byte(String hex) {
byte[] bts = new byte[hex.length() / 2];
for (int i = 0; i < bts.length; i++) {
bts[i] = (byte) Integer.parseInt(hex.substring(2*i, 2*i+2), 16);
}
return bts;
}
private void performTask(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) {
String MISC_MSISDN = request.getHeader("X-Up-Calling-Line-ID");
if(MISC_MSISDN==null) MISC_MSISDN = "13900000000";
try {
String getCode = this.getParameter(request,"code","0");
String getKey = this.getParameter(request,"key","0");
String getMd5 = this.getParameter(request,"md5","0");
MISC_MSISDN = this.getParameter(request,"MISC_MSISDN",MISC_MSISDN);
/*PrintWriter out1 = response.getWriter();
out1.println(getCode);
out1.println(getKey);
out1.println(getMd5);
out1.close();*/
if(getCode.equals("0")){
byte[] key = getKey();
if (!getKey.equals("0")){
key = hex2byte(getKey);
}
String strCode = byte2hex(encode(MISC_MSISDN.getBytes(),key));
String strKey = byte2hex(key);
String md5Num = byte2hex(md5(MISC_MSISDN.getBytes()));
PrintWriter out = response.getWriter();
out.println("Code:"+strCode);
out.println("Key:"+strKey);
out.println("md5 Phone Number:"+md5Num);
out.close();
}else{
byte[] byteCode = hex2byte(getCode);
byte[] byteKey = hex2byte(getKey);
String strPhoneNum = new String(decode(byteCode,byteKey));
PrintWriter out = response.getWriter();
out.println("Phone Number:"+strPhoneNum);
if (getMd5.equals("0")){
out.println("None md5 check!");
}else if (getMd5.equals(byte2hex(md5(strPhoneNum.getBytes())))){
out.println("md5 check Ok!");
}else{
out.println("md5 check false!");
}
out.close();
}
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void doGet(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) {
performTask(request, response);
}
public void doPost(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) {
performTask(request, response);
}
private java.lang.String getParameter(javax.servlet.http.HttpServletRequest request,
java.lang.String parameterName, java.lang.String defaultValue) throws java.lang.Exception {
java.lang.String[] parameterValues = null;
java.lang.String paramValue = null;
parameterValues = request.getParameterValues(parameterName);
if (parameterValues != null)
paramValue = parameterValues[0];
if (paramValue == null)
paramValue = defaultValue;
return paramValue;
}
}
</td>
</tr>
</table>
</td>
</tr>
<tr>
↑返回目录
前一篇: 从网页中提取URL一例
后一篇: 面向对象的设计原则