论坛首页 Java企业应用论坛

Discuz! Passport 的AzDGCrypt算法

浏览 4485 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-14  

前段时间客户(某电信公司)要求,我们公司的产品需要实现与他们的一些Discuz! Passport 的应用程序相挂接,比如他们电信的PHP语言写的CMS系统、PHP语言写的BBS系统等等。具体挂接的流程各个应用程序都不相同,这里我把Discuz! Passport 的AzDGCrypt算法实现贴出来

java 代码
  1. package xml;   
  2.   
  3. import java.security.MessageDigest;   
  4. import java.security.NoSuchAlgorithmException;   
  5. import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;   
  6. import com.sun.org.apache.xml.internal.security.utils.Base64;   
  7.   
  8. import java.io.UnsupportedEncodingException;   
  9. import java.net.*;   
  10. public class Key2 {   
  11.        
  12.     /**  
  13.     * Passport 加密函数  
  14.     *  
  15.     * @param        string      等待加密的原字串  
  16.     * @param        string      私有密匙(用于解密和加密)  
  17.     *  
  18.     * @return   string      原字串经过私有密匙加密后的结果  
  19.     */  
  20.     public String passport_encrypt(String txt,String key){         
  21.         //使用随机数发生器产生 0~32000 的值并 MD5()   
  22.         int j=(int)(Math.random()*32000);   
  23.         String encrypt_key = getMD5(Integer.toString(j));   
  24.         int ctr = 0;   
  25.         String tmp = "";   
  26.         for(int i = 0; i < txt.length(); i++) {   
  27.             // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零   
  28.             ctr = ctr == encrypt_key.length()? 0 : ctr;   
  29.             // $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,   
  30.             // 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1   
  31.             char a1=encrypt_key.charAt(ctr);   
  32.             char t1=txt.charAt(i);   
  33.             char t2=encrypt_key.charAt(ctr++);   
  34.             char a2=(char)(t1 ^ t2);   
  35.             tmp +=String.valueOf(a1)+a2;   
  36.         }   
  37.         return Base64.encode((passport_key(tmp,key)).getBytes());   
  38.     }   
  39.        
  40.     /**  
  41.     * Passport 解密函数  
  42.     *  
  43.     * @param        string      加密后的字串  
  44.     * @param        string      私有密匙(用于解密和加密)  
  45.     *  
  46.     * @return   string      字串经过私有密匙解密后的结果  
  47.      * @throws Base64DecodingException   
  48.     */  
  49.     public String passport_decrypt(String txt1,String key) throws Base64DecodingException {   
  50.         // $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,   
  51.         // 经过 passport_key() 函数处理后的返回值   
  52.         String txt = passport_key(new String(Base64.decode(txt1)), key);   
  53.         // 变量初始化   
  54.         String tmp = "";   
  55.         for (int i = 0; i < txt.length(); i++) {   
  56.             // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,   
  57.             // 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1   
  58.             tmp += (char)(txt.charAt(i) ^ txt.charAt(++i));   
  59.         }   
  60.         return tmp;   
  61.     }   
  62.     /**  
  63.     * Passport 密匙处理函数  
  64.     *  
  65.     * @param        string      待加密或待解密的字串  
  66.     * @param        string      私有密匙(用于解密和加密)  
  67.     *  
  68.     * @return   string      处理后的密匙  
  69.     */  
  70.     public String passport_key(String txt,String encrypt_key1){   
  71.         // 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值   
  72.         String encrypt_key = getMD5(encrypt_key1);   
  73.         // 变量初始化   
  74.         int ctr = 0;   
  75.         String tmp = "";   
  76.         for(int i = 0; i < txt.length(); i++) {   
  77.             // 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零   
  78.             ctr = ctr == encrypt_key.length() ? 0 : ctr;   
  79.             // $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,   
  80.             // 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1   
  81.             tmp += (char)(txt.charAt(i) ^ encrypt_key.charAt(ctr++));   
  82.         }   
  83.         return tmp;   
  84.     }   
  85.        
  86.     public static String byte2HEX(byte b) {   
  87.         return (""+"0123456789abcdef".charAt(0xf&b>>4)+"0123456789abcdef".charAt(b&0xF));   
  88.     }   
  89.   
  90.     public static byte stringHEX2bytes(String str) {   
  91.         return (byte) ("0123456789abcdef".indexOf(str.substring(0,1))*16 + "0123456789abcdef".indexOf(str.substring(1)));   
  92.     }   
  93.     public static String md5bytes2string(byte[] bytes){   
  94.         String result = "";   
  95.         for(int i=0; i
  96.             result += byte2HEX(bytes[i]);   
  97.         }   
  98.         return result;   
  99.     }   
  100.     public static byte[] md5string2bytes(String str){   
  101.         byte[] b = new byte[str.length()/2];   
  102.         for(int i=0; i
  103.             String s = str.substring(i*2,i*2+2);   
  104.             b[i] = stringHEX2bytes(s);   
  105.         }   
  106.         return b;   
  107.     }   
  108.     public String getMD5(String mds){   
  109.             String mdresult="";   
  110.             try {   
  111.                 MessageDigest md = MessageDigest.getInstance("MD5");   
  112.                 mdresult = md5bytes2string(md.digest(mds.getBytes()));   
  113.             } catch (NoSuchAlgorithmException e) {   
  114.                 e.printStackTrace();   
  115.             }   
  116.             return mdresult;   
  117.   
  118.            
  119.     }   
  120.        
  121.        
  122. }   

 

以上的类经过MD5、随机、异或、私匙、Base64等处理,加密后相对还是较安全的。当然在Discuz! Passport  应用程序中一般都需要一个Vierfy验证码,也是将参数或指定内容加密后再传输,在应用程序中验证,如果不匹配则可能数据处理不正确或者在传输过程中被截获作了更改。这样验证后又增加了一定的安全性。

   发表时间:2008-05-22  
95行有错误!
0 请登录后投票
   发表时间:2008-06-25  
zxc005 写道
95行有错误!

是JAVAEYE的文本编辑器有BUG吧,少了个)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics