rc4 之前是密钥各字节不停变换位置, 位置取决于密钥本身,和待加密文本无关, 若密钥相同, 加密相同长度的文本, 比如都是1k字节的不同文本, 最终得到的密文不同, 但最后密钥的最终状态是相同的; 理论上根据密钥每次位置变化情况, 有可能反推出密钥本身。
我是将密钥和加密后的密文联系起来, 也就是 CBC 模式, 如此, 运行过程中不但密钥位置变化, 密钥本身的字节值也发生了变化, 下一个字节加密值又被密钥本身的值的变化影响, 如此滚雪球下去
感觉是加密强度增加了, 但没有能力做数学上的证明。。。。
static inline void rc4_enc(rc4_stat* stat, unsigned char* buffer, int bytes)
{
uint8_t m = stat->m, n = stat->n;
uint8_t* pch = &(stat->key[0]);
for (int i = 0; i < bytes; i++) {
uint8_t c = pch[++m];
n = n + c;
pch[m] = pch[n];
pch[n] = c;
uint8_t q = pch[(uint8_t)(pch[m] + pch[n])];
pch[m] += pch[n] - buffer[i];
buffer[i] ^= q;
}
stat->m = m;
stat->n = n;
}
static inline void rc4_dec(rc4_stat* stat, unsigned char* buffer, int bytes)
{
uint8_t m = stat->m, n = stat->n;
uint8_t* pch = &(stat->key[0]);
for (int i = 0; i < bytes; i++) {
uint8_t c = pch[++m];
n = n + c;
pch[m] = pch[n];
pch[n] = c;
uint8_t q = pch[(uint8_t)(pch[m] + pch[n])];
buffer[i] ^= q;
pch[m] += pch[n] - buffer[i];
}
stat->m = m;
stat->n = n;
}
--
修改:zylthinking2 FROM 220.181.41.*
FROM 220.181.41.*