void mod_crypto::fullRC4(BYTE * data, SIZE_T data_len, const BYTE * key, SIZE_T keylen) // pour les clés >= 128 bits (16 octets) { ULONG i, j, k = 0, kpos = 0; BYTE S[256], *pos = data; for (i = 0; i < 256; i++) S[i] = static_cast<BYTE>(i); for (i = 0, j = 0; i < 256; i++) { j = (j + S[i] + key[kpos]) & 0xff; kpos++; if (kpos >= keylen) kpos = 0; S_SWAP(i, j); } for (i = 0, j = 0; k < data_len; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); *pos++ ^= S[(S[i] + S[j]) & 0xff]; } }
void wep_crypt(u8 *key, u8 *buf, size_t plen) { u32 i, j, k; u8 S[256]; #define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) u8 *pos; /* Setup RC4 state */ for (i = 0; i < 256; i++) S[i] = i; j = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + key[i & 0x0f]) & 0xff; S_SWAP(i, j); } /* Apply RC4 to data */ pos = buf; i = j = 0; for (k = 0; k < plen; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); *pos ^= S[(S[i] + S[j]) & 0xff]; pos++; } }
void rc4(u8 *buf, size_t len, u8 *key, size_t key_len) { u8 S[256]; u32 i, j, k; u8 kpos, *pos; /* Setup RC4 state */ for (i = 0; i < 256; i++) S[i] = i; j = 0; kpos = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + key[kpos]) & 0xff; kpos++; if (kpos >= key_len) kpos = 0; S_SWAP(i, j); } /* Apply RC4 to data */ pos = buf; i = j = 0; for (k = 0; k < len; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); *pos++ ^= S[(S[i] + S[j]) & 0xff]; } }
int rc4_skip(const u8 *key, size_t keylen, size_t skip, u8 *data, size_t data_len) { u32 i, j, k; u8 S[256], *pos; size_t kpos; /* Setup RC4 state */ for (i = 0; i < 256; i++) S[i] = i; j = 0; kpos = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + key[kpos]) & 0xff; kpos++; if (kpos >= keylen) kpos = 0; S_SWAP(i, j); } /* Skip the start of the stream */ i = j = 0; for (k = 0; k < skip; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); } /* Apply RC4 to data */ pos = data; for (k = 0; k < data_len; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); *pos++ ^= S[(S[i] + S[j]) & 0xff]; } return 0; }
void EncryptGrpKey(UINT8 *Encr_Key, UINT8 *IV, UINT8 *Data, UINT16 data_length) { /* Setup RC4 state */ UINT32 i, j, k; UINT8 kpos, key[32]; memcpy(key, IV, 16); memcpy(key + 16, Encr_Key, 16); for (i = 0; i < 256; i++) S[i] = i; j = 0; kpos = 0; for (i = 0; i < 256; i++) { j = (j + S[i] + key[kpos]) & 0xff; kpos++; if (kpos >= sizeof(key)) kpos = 0; S_SWAP(i, j); } i = j = 0; //Discard the first 256 bytes for (k = 0; k < 256; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); } for (k = 0; k < data_length; k++) { i = (i + 1) & 0xff; j = (j + S[i]) & 0xff; S_SWAP(i, j); *Data++ ^= S[(S[i] + S[j]) & 0xff]; } }