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"));
//  
// }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值