这个问题需要知道你的字节数组是以何种方式存储的!
也就是说,用什么方式传递给 C 语言的程序:是文件?还是网络的Socket.一般情况下,可以在java里面自己写相应的输出方式,例如:/**
* Write a byte value to OutputStream.
* @param dos OutputStream
* @param value the byte value
*/
protected void writeByte (OutputStream os, byte value) throws IOException {
os.write(value);
}
/**
* Write a int value to OutputStream.
* @param dos OutputStream
* @param value the int value
*/
protected void writeInt (OutputStream os, int value) throws IOException {
int tmp = ((value >>> 24) & 0xff);
os.write(tmp);
tmp = ((value >>> 16) & 0xff);
os.write(tmp);
tmp = ((value >>> 8) & 0xff);
os.write(tmp);
tmp = (value & 0xff);
os.write(tmp);
}这样,可以自己根据需要,以特定的字节顺序将数据输出!
也就是说,用什么方式传递给 C 语言的程序:是文件?还是网络的Socket.一般情况下,可以在java里面自己写相应的输出方式,例如:/**
* Write a byte value to OutputStream.
* @param dos OutputStream
* @param value the byte value
*/
protected void writeByte (OutputStream os, byte value) throws IOException {
os.write(value);
}
/**
* Write a int value to OutputStream.
* @param dos OutputStream
* @param value the int value
*/
protected void writeInt (OutputStream os, int value) throws IOException {
int tmp = ((value >>> 24) & 0xff);
os.write(tmp);
tmp = ((value >>> 16) & 0xff);
os.write(tmp);
tmp = ((value >>> 8) & 0xff);
os.write(tmp);
tmp = (value & 0xff);
os.write(tmp);
}这样,可以自己根据需要,以特定的字节顺序将数据输出!
问题是 不知道密钥和加密后的数据以何种方式发送
c方面是按字节接受 再直接强制类型转换tea算法涉及到的是java中的int与c中的long字节序相反
关键是在java一方加密时 每8个字节转换成2个int进行加密
与在c一方加密结果不同
{
register unsigned long y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32; while ( n-- > 0 )
{
sum += delta;
y += ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
z += ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
}
v[0] = y;
v[1] = z;
}void decipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32; // sum = delta << 5, in general sum = delta * n
while ( n-- > 0 )
{
z -= ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
y -= ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
sum -= delta;
}
v[0] = y;
v[1] = z;
}
转换成java很容易
关键是让两种语言产生的结果一致
void decipher( unsigned long * const v, const unsigned long * const k );int main(int argc, char* argv[])
{
unsigned long v1 [2] = {100, 100};
unsigned long k1 [4] = {100, 200, 300, 400};
unsigned long* const vs = v1;
const unsigned long* const ks = k1; encipher(vs, ks);
printf("%d, %d \n", v1 [0] , v1 [1] ); decipher(vs, ks);
printf("%d, %d \n", v1 [0] , v1 [1] ); return 0;
}
} public static void main(String argv[])
{
int v1 [] = {100, 100};
int k1 [] = {100, 200, 300, 400};
encipher(v1, k1);
System.out.println(" " + v1 [0] + " " + v1 [1] ); decipher(v1, k1);
System.out.println(" " + v1 [0] + " " + v1 [1] );
}
static void encipher( int [] v, int [] k )
{
int y = v[0], z = v[1];
int sum = 0, delta = 0x9E3779B9;
int a = k[0], b = k[1], c = k[2], d = k[3], n = 32; while ( n-- > 0 )
{
sum += delta;
y += ( z << 4 ) + a ^ z + sum ^ ( z >>> 5 ) + b;
z += ( y << 4 ) + c ^ y + sum ^ ( y >>> 5 ) + d;
}
v[0] = y;
v[1] = z;
}
static void decipher( int [] v, int [] k )
{
int y = v[0], z = v[1];
int sum = 0xC6EF3720, delta = 0x9E3779B9;
int a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
// sum = delta << 5, in general sum = delta * n
while ( n-- > 0 )
{
z -= ( y << 4 ) + c ^ y + sum ^ ( y >>> 5 ) + d;
y -= ( z << 4 ) + a ^ z + sum ^ ( z >>> 5 ) + b;
sum -= delta;
}
v[0] = y;
v[1] = z;
}}