`

Discuz! Passport 的AzDGCrypt算法

阅读更多

前段时间客户(某电信公司)要求,我们公司的产品需要实现与他们的一些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验证码,也是将参数或指定内容加密后再传输,在应用程序中验证,如果不匹配则可能数据处理不正确或者在传输过程中被截获作了更改。这样验证后又增加了一定的安全性。

分享到:
评论
2 楼 tvjody 2008-06-25  
zxc005 写道
95行有错误!

是JAVAEYE的文本编辑器有BUG吧,少了个)
1 楼 zxc005 2008-05-22  
95行有错误!

相关推荐

    Discuz!NT用户使用手册

    《Discuz!NT用户使用手册》是一份专为Discuz!NT系统用户设计的详尽指南,旨在帮助用户更好地理解和操作这一强大的社区论坛软件。Discuz!NT是基于.NET平台开发的一款开源社区软件,它提供了丰富的功能和高度的可定制...

    Discuz! 4.0.0 Build 20051212 GBK简体中文版(推荐)

    此次发布的是Discuz! 4.0.0开源版本,除了API目录下一些合作的接口,出于对合作伙伴负责的态度仍然加密外,其他全部源代码均被提供。如果不使用相关的功能,API目录可以被删除而不影响非相关功能的使用。 &lt;br&gt;...

    Discuz! 黑白风格

    【标题】"Discuz! 黑白风格"指的是基于Discuz! X系统的一款主题模板,它采用了简洁的黑白设计,营造出一种高端、专业的社区氛围。Discuz! 是一款非常流行的开源论坛软件,广泛应用于各类网站,提供强大的社区管理...

    discuz!-1.0

    Discuz!是一款非常知名的开源社区论坛软件,由Comsenz公司开发,自2001年发布以来,它已经成为许多网站构建在线社区的首选平台。"Discuz!-1.0"是该软件的最早版本,对于理解Discuz!的发展历程和源代码结构具有重要的...

    Discuz!X3.5 X3.4腾讯云验证码插件 1.0.0.zip

    Discuz!X3.5和X3.4是流行的开源社区论坛系统,它们为企业和个人提供了构建互动社区的强大工具。为了增强这些平台的安全性,腾讯云开发了一款名为“tencentcloud_captcha”的官方插件。这款插件的核心功能是集成腾讯...

    Discuz! -tools工具 (适用x2.5 x3.0 x3.1 x3.2 x3.4 )删除未使用图片附件等功能

    《Discuz! -tools工具详解:优化与管理论坛图片附件的利器》 Discuz! -tools工具是一款专为Discuz! 论坛系统设计的强大辅助工具,尤其适用于x2.5、x3.0、x3.1、x3.2、x3.4等不同版本。这款工具被广大论坛管理员亲切...

    discuz!3风格for discuz!2.0

    《Discuz!3风格适配Discuz!2.0详解》 Discuz!3风格是专为Discuz!2.0论坛系统设计的一款界面样式,它致力于提供更加现代、美观且用户友好的交互体验。这款风格的引入,使得论坛的整体视觉效果与功能布局有了显著的...

    Discuz!NT 源码

    【Discuz!NT 论坛源码】是一个基于ASP.NET技术构建的社区论坛软件,它为网站管理员提供了构建和管理在线社区的强大工具。这个源码是 Discuz!NT 的核心组成部分,允许用户深入理解其工作原理,并进行自定义开发以满足...

    Discuz!NT 3.0.0 SQL Server正式版源码(bbs)

    NT 3.0采用了一系列加密算法来保证安全性,Discuz!NT 官方发布的API应用都可以放心使用,第三方开发的应用需要经过Discuz!NT 官方认证,用户大可以放心使用。Discuz!NT 3.0的API的又一大改进是支持客户端调用,基于...

    Discuz!7.2用户手册.chm

    Discuz!7.2用户手册..................

    Discuz!NT 2.0 ,Discuz!NT 2.1 升级到 Discuz!NT 2.5 正式版 空间和相册的升级

    一 、Discuz!NT 2.0 ,Discuz!NT 2.1 升级到 Discuz!NT 2.5 正式版 空间和相册的升级 1 需要上传覆盖论坛目录中 admin/xml/ 目录下的 navmenu.config ,navmenu.js 文件。 2 根据插件包内 album 目录下《Discuz!NT...

    discuz!3.2 完美英文语言包

    Discuz! 3.2 完美英文语言包是一款专为Discuz! 3.2论坛系统设计的多语言资源,旨在为非中文环境下的用户提供流畅的使用体验。这款语言包包含了论坛系统的所有核心功能模块的英文翻译,确保了用户在浏览、发帖、管理...

    discuz!NT转discuz x 工具

    Discuz!NT是一款基于.NET平台的论坛系统,而Discuz!X是基于PHP语言的社区软件,两者在架构上存在较大差异。"Discuz!NT转Discuz!X工具"是为了帮助用户将原有的Discuz!NT论坛数据平滑迁移至Discuz!X系统,以实现数据的...

    Discuz! v1.0 正式版

    【标题】"Discuz! v1.0 正式版" 涉及的主要知识点是Discuz!这一知名论坛系统的早期版本。Discuz!是由康盛创想(Comsenz)公司开发的一款开源的社区论坛软件,广泛应用于搭建和管理互联网上的论坛社区。 【描述】中...

    Discuz! 论坛版块图标

    Discuz! 是一款非常流行的开源社区论坛软件,它允许用户创建和管理自己的在线论坛,具有丰富的功能和高度的可定制性。在这个特定的压缩包中,我们关注的是“论坛版块图标”,这些图标用于区分和装饰论坛的不同版块,...

    Discuz!NT2.5

    《Discuz!NT2.5:C#构建的开源论坛系统》 Discuz!NT V2.5是一款基于VS2008和C#开发的开源论坛程序,它以其强大的功能和灵活的扩展性,深受广大开发者和网站管理员的喜爱。这款论坛系统不仅提供了基本的讨论区、主题...

    Discuz! X3.1

    标题"Discuz! X3.1"指的是 Discuz! 系统的一个具体版本,即X3.1。Discuz! 是一个非常知名的开源社区论坛软件,由康盛创想(Comsenz)开发。X3.1是其在某个时间点推出的更新版本,通常会包含对前一版本的改进、新功能...

    去掉DZ自带首页发帖按钮 for discuz!.rar

    Discuz!是一款非常流行的开源社区论坛系统,深受许多网站管理员的喜爱。这个压缩包"去掉DZ自带首页发帖按钮 for discuz!.rar"是专为Discuz!设计的一个插件,目的是为了移除默认首页上的“发帖”按钮。这个功能可能对...

Global site tag (gtag.js) - Google Analytics