JML

net.sf.jqql
Class Crypter

java.lang.Object
  extended by net.sf.jqql.Crypter

public class Crypter
extends Object

加密解密QQ消息的工具类. QQ消息的加密算法是一个16次的迭代过程,并且是反馈的,每一个加密单元是8字节,输出也是8字节,密钥是16字节 我们以prePlain表示前一个明文块,plain表示当前明文块,crypt表示当前明文块加密得到的密文块,preCrypt表示前一个密文块 f表示加密算法,d表示解密算法 那么从plain得到crypt的过程是: crypt = f(plain ˆ preCrypt) ˆ prePlain 所以,从crypt得到plain的过程自然是 plain = d(crypt ˆ prePlain) ˆ preCrypt 此外,算法有它的填充机制,其会在明文前和明文后分别填充一定的字节数,以保证明文长度是8字节的倍数 填充的字节数与原始明文长度有关,填充的方法是:

 
 
      ------- 消息填充算法 ----------- 
      a = (明文长度 + 10) mod 8
      if(a 不等于 0) a = 8 - a;
      b = 随机数 & 0xF8 | a;              这个的作用是把a的值保存了下来
      plain[0] = b;                       然后把b做为明文的第0个字节,这样第0个字节就保存了a的信息,这个信息在解密时就要用来找到真正明文的起始位置
      plain[1 至 a+2] = 随机数 & 0xFF;    这里用随机数填充明文的第1到第a+2个字节
      plain[a+3 至 a+3+明文长度-1] = 明文; 从a+3字节开始才是真正的明文
      plain[a+3+明文长度, 最后] = 0;       在最后,填充0,填充到总长度为8的整数为止。到此为止,结束了,这就是最后得到的要加密的明文内容
      ------- 消息填充算法 ------------
   
 
 

Author:
luma, notXX

Constructor Summary
Crypter()
          constructor 构造函数
 
Method Summary
 byte[] decrypt(byte[] in, byte[] k)
           
 byte[] decrypt(byte[] in, int offset, int len, byte[] k)
          è§£å¯†
 byte[] encrypt(byte[] in, byte[] k)
           
 byte[] encrypt(byte[] in, int offset, int len, byte[] k)
          åР坆
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Crypter

public Crypter()
constructor 构造函数

Method Detail

decrypt

public byte[] decrypt(byte[] in,
                      int offset,
                      int len,
                      byte[] k)
解密

Parameters:
in - 密文
offset - 密文开始的位置
len - 密文长度
k - 密钥
Returns:
明文

decrypt

public byte[] decrypt(byte[] in,
                      byte[] k)
Parameters:
in - 需要被解密的密文
inLen - 密文长度
k - 密钥
Returns:
Message 已解密的消息

encrypt

public byte[] encrypt(byte[] in,
                      int offset,
                      int len,
                      byte[] k)
加密

Parameters:
in - 明文字节数组
offset - 开始加密的偏移
len - 加密长度
k - 密钥
Returns:
密文字节数组

encrypt

public byte[] encrypt(byte[] in,
                      byte[] k)
Parameters:
in - 需要加密的明文
inLen - 明文长度
k - 密钥
Returns:
Message 密文

JML