描述
- 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
}