#include "rc4_encry.h" quint8 RC4_Encry::BatteryKey[16] = {'8','A','D','2','1','1','0','E','0','0','1','B','3','6','9','C'}; RC4_Encry::RC4_Encry() { } void RC4_Encry::battery_and_user_random_value_calc(quint8 *buff, const quint16 bufflen, quint16 *ret_value) { quint8 key_status = 0; quint8 index = 0; quint16 sequence = 0; quint8 mb_rc4_buff[bufflen] = {0}; for (key_status = 0; key_status < 2; key_status++) { for (int i = 0; i < bufflen; i++) { mb_rc4_buff[i] = buff[i]; } rc4_encry(BatteryKey, 16, mb_rc4_buff, bufflen); index = (quint8)(mb_rc4_buff[0] & 0x0F); sequence = mb_rc4_buff[index]; index = (quint8)(mb_rc4_buff[index] & 0x0F); sequence += (quint16)(mb_rc4_buff[index] << 8); ret_value[key_status] = sequence; } } void RC4_Encry::rc4_encry(quint8 *key, quint32 klen, quint8 *data, quint32 dlen) { quint8 s[256] = {0}; rc4_init(s,key,klen); rc4_crypt(s,data,dlen); } void RC4_Encry::rc4_init(quint8 *s, quint8 *key, quint32 len) { int i=0; int j=0; quint8 tmp = 0; for(i=0;i<256;i++){ s[i] = i; } for(i=0;i<256;i++){ j = (j + s[i] + key[i%len]) % 256; tmp = s[i]; s[i] = s[j]; s[j] = tmp; } } void RC4_Encry::rc4_crypt(quint8 *s, quint8 *data, quint32 len) { int i = 0, j = 0, t = 0; quint32 k = 0; quint8 tmp = 0; for (k = 0; k < len; k++) { i = (i + 1) % 256; j = (j + s[i]) % 256; tmp = s[i]; s[i] = s[j]; s[j] = tmp; t = (s[i] + s[j]) % 256; data[k] ^= s[t]; } }