描述

  • 1.初始化S
/* Initialization */
for i = 0 to 255 do
S[i] = i;
T[i] = K[i mod keylen]

j = 0;
for i = 0 to 255 do
	j = (j + S[i] + T[i]) mod 256;
	Swap (S[i], S[j]);

使用 Key 对 S 进行置换, 但是S仍然包含0~255的元素.

  • 2. 接下来生成密钥流
/* Stream Generation */
i, j = 0;
while (true)
	i = (i + 1) mod 256;
	j = (j + S[i]) mod 256;
	Swap (S[i], S[j]);
	t = (S[i] + S[j]) mod 256;
	
	k = S[t];

在解密中, 将k与下一明文字节异或, 在解密中, 将k的值与下一密文字节异或

实现

  • python
def init_s_box(key: bytearray) -> bytearray:
    s_box = bytearray([i for i in range(256)])
    j = 0
    for i in range(256):
        j = (j + s_box[i] + key[i % len(key)]) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box
 
def crypt(data: bytearray, key: bytearray) -> bytearray:
    s_box = init_s_box(key)
 
    i, j = (0, 0)
    for index in range(len(data)):
        i = (i + 1) % 256
        j = (j + s_box[i]) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
 
        data[index] ^= s_box[(s_box[i] + s_box[j]) % 256]
 
    return data
  • rust
fn init_s_box(key: &dyn AsRef<[u8]>) -> [u8; 256] {
    let key = key.as_ref();
    let mut s_box: [u8; 256] = std::array::from_fn(|i| i as u8);
    let t_box: [u8; 256] = std::array::from_fn(|i| key[i % key.len()]);
    let mut j = 0;
    for i in 0..256 {
        j = (j + s_box[i] as usize + t_box[i] as usize) % 256;
        s_box.swap(j, i);
    }
    s_box
}
pub fn crypt(buf: &dyn AsRef<[u8]>, key: &dyn AsRef<[u8]>) -> Vec<u8> {
    let mut s_box = init_s_box(key);
    let buf = buf.as_ref();
    let mut result = Vec::new();
    let (mut i, mut j) = (0, 0);
    for &b in buf {
        i = (i + 1) % 256;
        j = (j + s_box[i] as usize) % 256;
        s_box.swap(i, j);
        result.push(b ^ s_box[(s_box[i] as usize + s_box[j] as usize) % 256]);
    }
    result
}