/**
* @declaration 将一个字节数组转化为整数,采用Big-Endian格式进行解析
* @param a待转化的字节数组
* @param i字节数组的起始索引
* @return转化后的整数
*/
public static int os2ip(byte[] a, int i)
{
int x0 = a[i + 3] & 0x000000ff;
int x1 = a[i + 2] << 8 & 0x0000ff00;
int x2 = a[i + 1] << 16 & 0x00ff0000;
int x3 = a[i] << 24 & 0xff000000;
return x0 | x1 | x2 | x3;
}
/**
* @declaration 将整数x转化为4字节数组,采用Big-Endian格式进行解析
* @param x待转化的整数x
* @return 解析后的字节数组,长度为4
*/
public static byte[] i2osp(int x)
{
byte[] s = new byte[4];
s[3] = (byte)( x & 0x000000ff );
s[2] = (byte)( ( x & 0x0000ff00 ) >>> 8 );
s[1] = (byte)( ( x & 0x00ff0000 ) >>> 16 );
s[0] = (byte)( ( x & 0xff000000 ) >>> 24 );
return s;
}
/**
* @declaration密钥初始化函数
* @param p_key 长度为128位的密钥数组,若密钥长度小于128位,
*则必须在填充后再调用该函数
*/
public void keySetup(byte[] p_key)
{
int k0, k1, k2, k3, i;
k0 = os2ip(p_key, 12); k1 = os2ip(p_key, 8); k2 = os2ip(p_key, 4); k3 = os2ip(p_key, 0);
x[0] = k0;
x[2] = k1;
x[4] = k2;
x[6] = k3;
x[1] = ( k3 << 16 ) | ( k2 >>> 16 );
x[3] = ( k0 << 16 ) | ( k3 >>> 16 );
x[5] = ( k1 << 16 ) | ( k0 >>> 16 );
x[7] = ( k2 << 16 ) | ( k1 >>> 16 );
c[0] = rotL(k2, 16); c[2] = rotL(k3, 16); c[4] = rotL(k0, 16); c[6] = rotL(k1, 16);
c[1] = (k0 & 0xffff0000) | (k1 & 0x0000ffff);
c[3] = (k1 & 0xffff0000) | (k2 & 0x0000ffff);
c[5] = (k2 & 0xffff0000) | (k3 & 0x0000ffff);
c[7] = (k3 & 0xffff0000) | (k0 & 0x0000ffff);
carry = 0;
for( i = 0; i < 4; i++)
{
next_state();
}
for( i = 0; i < 8; i++)
{
c[ (i + 4) & 7 ] ^= x[i];
}
}
/**
* @declaration 该函数用于生成128位随机密钥,用于直接和明文进行异或处理
* @param p_dest产生的128位随机密钥
* @param data_size 需要产生的随机密钥数量,必须是16的倍数
*/
责任编辑:小草