在MSN Messenger通讯中,都会看到关于msnobj的信息
如:
>>CHG 140 NLN 805306468 %3Cmsnobj%20Creator%3D%22xxxx%40hotmail.com%22%20Size%3D%2233630%22%20Type%3D%223%22%20Location%3D%22TFR7.dat%22%20Friendly%3D%22AAA%3D%22%20SHA1D%3D%22fUp1qsbEAHWV3IFgjMglKlT%2FC5k%3D%22%20SHA1C%3D%22b%2BF7JnnL2K5ysdNzW727SjSJKoQ%3D%22%2F%3E
后面那串urlencode过的部分,其实就是msnobj。
我们用urldecode以后,就可以看到真实的内容。
<msnobj Creator="xxxxx@citiz.net" Size="24588" Type="3" Location="TFR73.dat" Friendly="AAA=" SHA1D="Tf/ZG8+rFqIK3YMrvo2dzq0afgs=" SHA1C="pIz9DyWNXhtdDw5pd/QTkcBw99I="/>
msnobj中有些元素,大家一看就明白是怎么回事了。
size是指文件大小,location就是文件名,friendly是固定的,我也在研究中。
type是一个类型说明,3就是头像,其他可能代表了emotion等等,sha1d,sha1c接下来会说明。
对方的MSN Messenger获得了你的<msnobj>后,就知道,你的msn的头像信息,就会发起一个p2p的请求。
sha1d是对于你这个文件的数字摘要,把TFR73.dat这个文件所有的字节读入,然后进行sha-1算法的运算,获得一个20字节流,再用base64进行加码获得的。
sha1c是对于msnobj各项元素串进行数字摘要的结果。
根据这个原理,我们就可以很容易编程实现sha1d,sha1c。
try{
//get an object of SHA-1
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
//read file byte stream
File f=new File("TFR73.png");
int len=(int)f.length();
FileInputStream fi=new FileInputStream(f);
byte[] buf=new byte[len];
fi.read(buf);
fi.close();
//create sha1d value
alga.update(buf);
byte[] digesta=alga.digest();
String sha1d=Base64.encodeBytes(digesta);
//create sha1c value
StringBuffer sb=new StringBuffer(50);
sb.append("Creator");
sb.append("enhydraboy_robot01@citiz.net");
sb.append("Size");
sb.append(len);
sb.append("Type");
sb.append(3);
sb.append("Location");
sb.append("TFR73.dat");
sb.append("Friendly");
sb.append("AAA=");
sb.append("SHA1D");
sb.append(sha1d);
alga.update(sb.toString().getBytes());
digesta=alga.digest();
String sha1c=Base64.encodeBytes(digesta);
System.out.println("SHA1D=\""+sha1d+"\"");
System.out.println("SHA1C=\""+sha1c+"\"");
}catch(Exception e){
e.printStackTrace();
}
结果如下:
SHA1D="Tf/ZG8+rFqIK3YMrvo2dzq0afgs="
SHA1C="pIz9DyWNXhtdDw5pd/QTkcBw99I="
如:
>>CHG 140 NLN 805306468 %3Cmsnobj%20Creator%3D%22xxxx%40hotmail.com%22%20Size%3D%2233630%22%20Type%3D%223%22%20Location%3D%22TFR7.dat%22%20Friendly%3D%22AAA%3D%22%20SHA1D%3D%22fUp1qsbEAHWV3IFgjMglKlT%2FC5k%3D%22%20SHA1C%3D%22b%2BF7JnnL2K5ysdNzW727SjSJKoQ%3D%22%2F%3E
后面那串urlencode过的部分,其实就是msnobj。
我们用urldecode以后,就可以看到真实的内容。
<msnobj Creator="xxxxx@citiz.net" Size="24588" Type="3" Location="TFR73.dat" Friendly="AAA=" SHA1D="Tf/ZG8+rFqIK3YMrvo2dzq0afgs=" SHA1C="pIz9DyWNXhtdDw5pd/QTkcBw99I="/>
msnobj中有些元素,大家一看就明白是怎么回事了。
size是指文件大小,location就是文件名,friendly是固定的,我也在研究中。
type是一个类型说明,3就是头像,其他可能代表了emotion等等,sha1d,sha1c接下来会说明。
对方的MSN Messenger获得了你的<msnobj>后,就知道,你的msn的头像信息,就会发起一个p2p的请求。
sha1d是对于你这个文件的数字摘要,把TFR73.dat这个文件所有的字节读入,然后进行sha-1算法的运算,获得一个20字节流,再用base64进行加码获得的。
sha1c是对于msnobj各项元素串进行数字摘要的结果。
根据这个原理,我们就可以很容易编程实现sha1d,sha1c。
try{
//get an object of SHA-1
java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
//read file byte stream
File f=new File("TFR73.png");
int len=(int)f.length();
FileInputStream fi=new FileInputStream(f);
byte[] buf=new byte[len];
fi.read(buf);
fi.close();
//create sha1d value
alga.update(buf);
byte[] digesta=alga.digest();
String sha1d=Base64.encodeBytes(digesta);
//create sha1c value
StringBuffer sb=new StringBuffer(50);
sb.append("Creator");
sb.append("enhydraboy_robot01@citiz.net");
sb.append("Size");
sb.append(len);
sb.append("Type");
sb.append(3);
sb.append("Location");
sb.append("TFR73.dat");
sb.append("Friendly");
sb.append("AAA=");
sb.append("SHA1D");
sb.append(sha1d);
alga.update(sb.toString().getBytes());
digesta=alga.digest();
String sha1c=Base64.encodeBytes(digesta);
System.out.println("SHA1D=\""+sha1d+"\"");
System.out.println("SHA1C=\""+sha1c+"\"");
}catch(Exception e){
e.printStackTrace();
}
结果如下:
SHA1D="Tf/ZG8+rFqIK3YMrvo2dzq0afgs="
SHA1C="pIz9DyWNXhtdDw5pd/QTkcBw99I="