`
bianku
  • 浏览: 72209 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

SIPC认证算法java实现

阅读更多
SIPC的认证算法,支持SHA1和MD5。 



import java.io.UnsupportedEncodingException; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Random; 

/** 
* @author zackel 
* @date 2007-11-22 21:38:07 
* @project 
*/ 
public class GenAuthResponse { 
// Fields 
private String cnonce; 
private String domain; 
private String nonce; 
private String password; 
private static Random random; 
private String sid; 
private boolean usingSHA1=false; 
private String salt; 
private String encryptPassword; 

public void setSalt(String salt) { 
this.salt = salt; 
} 

public String getEncryptPassword() { 
return encryptPassword; 
} 

public void setEncryptPassword(String encryptPassword) { 
this.encryptPassword = encryptPassword; 
} 

public String getSalt() { 
return salt; 
} 

// public void setSalt(String salt) { 
// this.salt = salt; 
// } 

public boolean isUsingSHA1() { 
return usingSHA1; 
} 

public void setUsingSHA1(boolean usingSHA1) { 
this.usingSHA1 = usingSHA1; 
} 

public String getCnonce() { 

return this.cnonce; 
} 

public void setCnonce(String cnonce) { 
this.cnonce = cnonce; 
} 

public String getDomain() { 
return domain; 
} 

public void setDomain(String domain) { 
this.domain = domain; 
} 

public String getNonce() { 
return nonce; 
} 

public void setNonce(String nonce) { 
this.nonce = nonce; 
} 

public String getPassword() { 
return password; 
} 

public void setPassword(String password) { 
this.password = password; 
} 

public String getSid() { 
return sid; 
} 

public void setSid(String sid) { 
this.sid = sid; 
} 

// Methods 
public GenAuthResponse(String sid, String password, String domain, String nonce) 
{ 
this.sid = sid; 
this.password = password; 
this.domain = domain; 
this.nonce = nonce; 


Calendar cal = new GregorianCalendar(); 
int seed = cal.get(Calendar.DAY_OF_YEAR) * 0xf4240; 
seed += cal.get(Calendar.HOUR) * 0x2710; 
seed += cal.get(Calendar.MINUTE) * 100; 
seed += cal.get(Calendar.SECOND); 
// random = new Random(System.currentTimeMillis()); 

random = new Random(seed); 
this.cnonce = GenCNonce(); 
this.salt=GenSalt(); 
// System.out.println(salt); 
} 

private static String BinToHex(byte[] binary) 
{ 
// StringBuilder builder = new StringBuilder(); 
// for(byte num : binary) 
// { 
// int n = num; 
// if (n < 0) 
// n = n &0xff; 
// 
// if ((int)n > 15) 
// { 
// builder.append(String.format("%X",n)); 
// 
// } 
// else 
// { 
// builder.append(String.format("0%X",n)); 
// 
// } 
// } 
//// System.out.println(builder.toString()); 
// return builder.toString(); 
if (binary == null) 
return "null"; 
if (binary.length == 0) 
return ""; 

StringBuilder buf = new StringBuilder(); 

for (int i = 0; i < binary.length; i++) { 
if (binary[i] < 0) 
buf.append(Integer.toHexString(binary[i]&0xff)); 
else if (binary[i] < 16) { 
buf.append('0'); 
buf.append(Integer.toHexString(binary[i])); 
} else { 
buf.append(Integer.toHexString(binary[i])); 
} 
} 

return buf.toString().toUpperCase(); 
} 

private String GenH1(byte[] key) 
{ 
String s = String.format(":%s:%s", this.nonce, this.getCnonce()); 
// System.out.println("nonce:"+this.nonce ); 
// System.out.println("Cnonce:"+this.getCnonce()); 
// System.out.println(s); 
byte[] bytes; 
try { 
// bytes = s.getBytes("UTF-8"); 
bytes=new String(s.getBytes(),"utf-8").getBytes(); 

// System.out.println("h1 bytes:"+this.BinToHex(bytes)); 
byte[] array = new byte[key.length + bytes.length]; 
System.arraycopy(key,0,array,0,key.length); 
System.arraycopy(bytes, 0, array, key.length, bytes.length); 

// System.out.println("h1 array:"+this.BinToHex(array)); 
return MD5ToHex(array); 
} catch (UnsupportedEncodingException e) { 
e.printStackTrace(); 
} 
return null; 

} 

private String GenH2() 
{ 
String s = String.format("REGISTER:%s", this.sid); 
// System.out.println(s); 
try { 

// return MD5ToHex(s.getBytes("UTF-8")); 
return MD5ToHex(new String(s.getBytes(),"utf-8").getBytes()); 
} catch (UnsupportedEncodingException e) { 
e.printStackTrace();  
 
} 
return null; 
} 

private byte[] GenKey() 
{ 
if(this.usingSHA1==true){ 
String s1 = String.format("%s:%s:", this.sid, this.domain); 
// System.out.println(s1); 
try { 
this.encryptPassword=DoHashPassword(this.password); 
// System.out.println("GenKey enc psw:"); 
// System.out.println(this.encryptPassword); 

byte[] bytes=(new String(s1.getBytes(),"utf-8").getBytes()); 
// System.out.println("GenKey bytes:"+BinToHex(bytes)); 
byte[] src=this.HexToBin(this.encryptPassword.substring(8));//和C#定义不一样? 
// System.out.println("psw0-8:"+BinToHex(src)); 
// byte[] src=this.HexToBin(this.salt); 
byte[] dst=new byte[bytes.length +src.length ]; 
System.arraycopy(bytes,0,dst,0,bytes.length); 
System.arraycopy(src,0,dst,bytes.length,src.length); 
// System.out.println("GenKey dst:"+BinToHex(dst)); 
return new SHA1().getDigestOfBytes(dst); 

} catch (UnsupportedEncodingException e) { 
// TODO 自动生成 catch 块 
e.printStackTrace(); 
} 

} 
String s = String.format("%s:%s:%s", this.sid, this.domain, this.password); 
// System.out.println(s); 
try { 
// return MD5(s.getBytes("UTF-8")); 
return MD5(new String(s.getBytes(),"utf-8").getBytes()); 
} catch (UnsupportedEncodingException e) { 

e.printStackTrace(); 
} 
return null; 
} 

public String GenResponse() 
{ 
byte[] key = this.GenKey(); 
// System.out.println("Key:"); 
// System.out.println(this.BinToHex(key)); 
String str = this.GenH1(key); 
// System.out.println("H1:"); 
// System.out.println(str); 
String str2 = this.GenH2(); 
// System.out.println("H2:"); 
// System.out.println(str2); 
return this.GenResponse(str, str2); 
} 

private String GenResponse(String h1, String h2) 
{ 
String s = String.format("%s:%s:%s", h1, this.nonce, h2); 
// System.out.println(s); 
try { 
// return MD5ToHex(s.getBytes("UTF-8")); 
return MD5ToHex(new String(s.getBytes(),"utf-8").getBytes()); 
} catch (UnsupportedEncodingException e) { 

e.printStackTrace(); 
} 
return null; 
} 

private String GenCNonce() 
{ 
int num = 0; 
int num2 = 0; 
int num3 = 0; 
int num4 = 0; 
synchronized (random) 
{ 
num = random.nextInt(); 
num2 = random.nextInt(); 
num3 = random.nextInt(); 
num4 = random.nextInt(); 
} 
if ((num >> 0x18) < 0x10) 
{ 

num += 0x10000000; 
} 
if ((num2 >> 0x18) < 0x10) 
{ 
num2 += 0x10000000; 
} 
if ((num3 >> 0x18) < 0x10) 
{ 
num3 += 0x10000000; 
} 
if ((num4 >> 0x18) < 0x10) 
{ 
num4 += 0x10000000; 
} 
return String.format("%X%X%X%X", new Object[] { num, num2, num3, num4 }); 
// 
} 


private static byte[] HexToBin(String hex) 
{ 
hex=hex.toUpperCase(); 
if ((hex == null) || (hex.length() < 1)) 
{ 
return new byte[0]; 
} 
int num = hex.length() / 2; 
byte[] buffer = new byte[num]; 
num *= 2; 
for (int i = 0; i < num; i++) 
{ 
// System.out.println(hex.substring(i, i+2)); 
char c1,c2; 
c1=hex.substring(i,i+1).charAt(0); 
c2=hex.substring(i+1, i+2).charAt(0); 
// System.out.println(c1); 
if(c1>='A') 
c1=(char) (10+c1-'A'); 
else 
c1=(char) (c1-'0'); 
if(c2>='A') 
c2=(char) (10+c2-'A'); 
else 
c2=(char) (c2-'0'); 

// System.out.println(c1-'A'); 
// System.out.println(c2); 
// System.out.println(c1*16+c2); 
int num3=c1*16+c2; 
// int num3 = Integer.parseInt(hex.substring(i, i+2)); 
buffer[i / 2] = (byte) num3; 
i++; 

} 
// System.out.println(BinToHex(buffer)); 
return buffer; 
} 

private byte[] MD5(byte[] data) 
{ 
return MD5Util.MD5Encode(data); 
} 

private String MD5ToHex(byte[] data) 
{ 
// data = MD5(data); 
return BinToHex(MD5(data)); 
} 

public String DoHashPassword(String _password){ 
try { 
return DoHashPassword(new String(_password.getBytes(),"utf-8").getBytes(),this.HexToBin(this.salt)); 
} catch (UnsupportedEncodingException e) { 
e.printStackTrace(); 
} 
return null; 

} 
public String DoHashPassword(byte[] password, byte[] b0) 
{ 
SHA1 sha=SHA1.Create(); 


byte[] src = sha.getDigestOfBytes(password); 
// System.out.println("psw sha1:"); 
// System.out.println(this.BinToHex(src)); 
for (int i = 0; i < password.length; i++) 
{ 
password[i] = 0; 
} 
byte[] dst = new byte[b0.length + src.length]; 
System.arraycopy(b0, 0, dst, 0, b0.length); 
System.arraycopy(src, 0, dst, b0.length, src.length); 
byte[] buffer3 = sha.getDigestOfBytes(dst); 

// System.out.println("buffer3 sha1:"); 
// System.out.println(this.BinToHex(buffer3)); 

byte[] buffer4 = new byte[b0.length + buffer3.length]; 
System.arraycopy(b0, 0, buffer4, 0, b0.length); 
System.arraycopy(buffer3, 0, buffer4, b0.length, buffer3.length); 
// System.out.println("enc psw:"); 
// System.out.println(this.BinToHex(buffer4)); 

return this.BinToHex(buffer4); 

} 

public String GenSalt(){ 
byte[] salt = new byte[4]; 

synchronized (random) 
{ 
salt[0] = (byte)random.nextInt(255); 
salt[1] = (byte)random.nextInt(255); 
salt[2] = (byte)random.nextInt(255); 
salt[3] = (byte)random.nextInt(255); 
// System.out.println(salt[3]); 
return this.BinToHex(salt); 
// return salt; 
} 



} 
// public static String EncodePassword(byte[] password, byte[] b0) 
// { 
// using (SHA1 sha = SHA1.Create()) 
// { 
// byte[] src = sha.ComputeHash(password); 
// for (int i = 0; i < password.Length; i++) 
// { 
// password[i] = 0; 
// } 
// byte[] dst = new byte[b0.Length + src.Length]; 
// Buffer.BlockCopy(b0, 0, dst, 0, b0.Length); 
// Buffer.BlockCopy(src, 0, dst, b0.Length, src.Length); 
// byte[] buffer3 = sha.ComputeHash(dst); 
// byte[] buffer4 = new byte[b0.Length + buffer3.Length]; 
// Buffer.BlockCopy(b0, 0, buffer4, 0, b0.Length); 
// Buffer.BlockCopy(buffer3, 0, buffer4, b0.Length, buffer3.Length); 
// return BinaryToHex(buffer4); 
// } 
// } 
// public static String BinaryToHex(byte[] binary) 
// { 
// StringBuilder builder = new StringBuilder(); 
// for(byte num:binary) 
// { 
// if (num > 15) 
// { 
// builder.("{0:X}", num); 
// } 
// else 
// { 
// builder.AppendFormat("0{0:X}", num); 
// } 
// } 
// return builder.toString(); 
// } 

// public static void main(String[] args){ 
// GenAuthResponse genAuthResponse=new GenAuthResponse("759909","A","fetion.com.cn", "250BA679516452E860C02B1638D52849"); 
// genAuthResponse.setUsingSHA1(true); 
// genAuthResponse.setCnonce("798AC8BD240DABB21C9259C8148373F2"); 
// genAuthResponse.setSalt("FD761703"); 
// 
//// genAuthResponse.HexToBin("E0FF0100"); 
// System.out.println(genAuthResponse.GenResponse()); 
//// System.out.println(genAuthResponse.getCnonce()); 
// 
//// Random random = new Random(10); 
//// int i=random.nextInt(9); 
// int num3; 
//// System.out.println(num3 = Integer.parseInt("0x5A")); 
// 
// } 
} 

 

分享到:
评论

相关推荐

    Java开发需要的Sip包(6个全)

    1. **JainSipApi1.2**:这是JAIN SIP API的实现,JAIN是Java电信接入接口(Java Advanced Intelligence Network)的缩写,它提供了一个标准接口,使得开发者能够编写与底层网络技术无关的SIP应用程序。Api1.2是该...

    SSK飚王SIPC001网络摄像头升级固件3501.1.2.0版

    SSK飚王SIPC001网络摄像头升级固件3501.1.2.0版(2014年1月24日发布)该驱动为飚王SIPC001网络摄像头升级固件,版本为3501.1.2.0。 该版固件做出了一下的更新和修复内容: 1、支持远程调用存储卡录像(AVI)文件; ...

    一种Turbo码的编码算法-一种Turbo码的编码算法在CDMA2000系统中的仿真实现.rar

    此压缩包中的内容,"一种Turbo码的编码算法在CDMA2000系统中的仿真实现.pdf",显然详细介绍了如何在实际应用中实现这种编码算法。 首先,我们要理解Turbo码的基本原理。Turbo码由两部分组成:并行交织乘积码(PIPC...

    sipC++扩展python[收集].pdf

    ### sipC++扩展Python知识点详解 #### 一、概述 在现代软件开发中,混合语言编程成为了一种常见的技术手段,特别是在需要结合Python的高级功能与C++的强大性能时更是如此。`sipC++扩展python[收集].pdf`文档提供了...

    sipC++扩展python.pdf

    根据给定的文件信息,本文将详细介绍如何使用sip工具将C++扩展模块集成到Python中,并创建Python的动态链接库(DLL),以及如何定义和实现C++中的函数以供Python调用。 1. 使用sip工具 sip是一个生成Python绑定的...

    SIPC 前端设计开发平台.zip

    可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的...

    QT写的飞信。

    `sipc.cpp` 文件很可能是飞信的协议栈实现,"sipc"可能是“飞信协议”的缩写。这个文件会包含解析和构造飞信特有的通信协议的代码,协议栈是任何网络应用的基础,它处理网络连接、数据传输和错误恢复等底层细节,...

    codepen:SIPC 前端设计开发平台

    在 CodePen 的SIPC前端设计开发平台上,开发者可能会利用这些JavaScript知识来构建交互式的用户界面,实现动态数据加载,以及与其他API和服务的通信。 在实际项目中,CodePen的用户可以通过创建 Pens(代码片段)来...

    中国移动的飞信类fetion_php fetint

    开发者可能通过实例化这个类并调用其方法来实现与飞信服务器的交互。例如,可能有`login()`函数用于用户登录,`sendMessage()`函数用于发送消息,`receiveMessages()`函数用于接收新消息,以及`logout()`函数用于...

    Prevcrim:Prevcrim-“ Scrima Integrado deprevencióndecrímenes(SIPC)”。 (没有终点站)

    Prevcrim-“预防犯罪综合体(SIPC)”。 洛桑因普特人个人信息管理和格式管理专员根据独立性,连续性,连续性,连续性,统一性,连续性,统一性,统一性,统一性,统一性,统一性,统一性和统一性。 参加。 埃斯特...

    fetion.classes.20080731.rar_PHP 接口_PHPQQClient.rar_fetion php cl

    2. **class.SIPC.php**:SIPC可能代表“Simple IM Protocol Client”,这是一个简单的即时通讯协议客户端。这个文件可能是飞信API的底层实现,封装了与飞信服务器通信的网络协议细节。 3. **www.pudn.com.txt**:这...

    中国移动飞信php类

    开发者可以通过实例化这个类,并调用相应的成员函数来实现与飞信的接口交互。例如,`login()` 函数用于用户登录,`sendSMS()` 函数则用于发送短信到其他飞信用户。 `class.SIPC.php` 文件可能涉及到的是SIPC协议,...

    同航空平台双偏振仪器间的视场匹配方法

    以飞行实验中安装在同一个航空平台上的偏振扫描仪(POSP)和同时偏振相机(SIPC)为例,提出了一种对单幅SIPC图像及单扫描圈内POSP星下点邻近数据进行快速视场匹配的方法。通过POSP旋转扫描采集模式下的拖影权重系数模板,...

    科达IP工具

    "科达IP工具"是一款由江苏科达公司专门为IPC(网络摄像机)系统设计的IP扫描和维护软件。在IT领域,这样的工具对于网络监控系统的管理和维护至关重要。它集成了多种功能,帮助用户轻松地管理和配置网络中的IP摄像机...

    某公司海外油气勘探开发发展战略研究.pptx

    动态经济评估是该公司在海外油气项目管理中的核心工具,它旨在提高投资决策的科学性和透明度,同时发现和解决项目中存在的问题,以实现长期战略目标。这一过程始于2005年,由公司计划部门牵头,委托专业咨询机构进行...

    eSDK_CC_WebVoip_V1.5.10

    4. **tup_sipc.dll, tup_callservice.dll, tup_https_clt.dll**:这些都是TUP组件的关键部分,分别对应SIP通信、呼叫服务和HTTPS客户端功能,是实现VoIP呼叫的关键模块。 5. **HME_Video.dll**:这可能与高清多媒体...

    nagios 飞信程序

    class.curl.php class.fetion.php class.SIPC.php send.php 更改$sms-&gt;phone_num 及$sms-&gt;password参数 2.该程序默认调用/usr/local/nagios/ smservice.out该文件的内容为短信内容 用wget -qO- ...

Global site tag (gtag.js) - Google Analytics