809协议 java_JT809转发协议加密算法java实现

private static final Long UINT32_MAX_VALUE = 4294967295L;

private static byte[] encrypt(long M1, long IA1, long IC1, long key, byte[] bytes)

{

// 第一个传入的key默认认为小于等于UINT32_MAX_VALUE

int index = 0;

if (0 == key)

{

key = 1;

}

int size = bytes.length;

if (M1 == 0)

{

// 排除除以0的异常

return new byte[0];

}

while (index < size)

{

key = IA1 * (key % M1) + IC1;

// 若key大于,取低位32位,java是有符号的所以unit32必须要用long类型类承接,而key为long类型时

// key = IA1 * (key % M1) + IC1很可能大于unit32的最大值,java实现里面是正常的,但是对比c#

// 加密后的数组字符串发现不一致,后来发现原始实现中用的uint32,当大于他的最大值是高位会被丢弃

// 也就是&UINT32_MAX_VALUE后的值才是正确的值

if (key > UINT32_MAX_VALUE)

{

key &= UINT32_MAX_VALUE;

}

byte b = (byte)((key >> 20) & 0xFF);

bytes[index++] ^= b;

}

return bytes;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值