1、rc4加密算法
rc4是面向字节流的加密算法,通过在加密地过程中不断地修改变换表来达到算法强度和校验序列的完整性
(如果丢失了其中一个字节,那么所有在该字节后解密的数据都会损坏)。
加密流程:
1.1 加密表的初始化(设加密表的长度为256,事实上加密表的长度可以任意,只是在实现时256可以用一个字节表示索引)
|-----------------------------------------|
|初始化Security Box (Sbox) |---->|------------------------------------|
|(设为0~255即可,算法上没有 | | for i = 0, 255 => Sbox[i] = i |
|要求,只要和解密表一致就可以) | |------------------------------------|
|-----------------------------------------|
|
|-----------------------------------------| |-----------------------------------------------|
|通过key来扰乱Sbox,key可以是任|---->| m = n = 0, extend(key, 256 ) |
|意相量好的字符序列,它最长是 | | for i = 0, 256 |
|和Sbox的长度一样,如果它比Sbox| | m = (m + Sbox[i] + key[n+1])%256 |
|长度少,那么重复使用 | | Swap(Sbox[i], Sbox[m]) |
|-----------------------------------------| | n = (n +1 )%256 |
|-----------------------------------------------|
1.2 加密字节
|--------------------------------------------| |-----------------------------------------------|
| 在Sbox中查找加密字节,并修改 |---->| i, j = (Sbox.idx_i+1)%256, Sbox.idx_j |
| Sbox 的值 | | j = (Sbox[i] + j) % 256 |
|--------------------------------------------| | code = s[(Sbox[i] + Sbox[j]) % 256] |
| | Swap(Sbox[i], Sbox[j]) |
| | Sbox.idx_i, Sbox.idx_j = i, j |
| | return code |
| |------------------------------------------------|
|
|----------------------------------| |----------------------------------------|
|加密对应的输入字节 |---->|out_byte = in_byte XOR code |
|----------------------------------| |-----------------------------------------|
解密表的初始化过程和解密的过程完全一样,也就是说按照上面的算法生成两份表Table1和Table2,那么
input_byte = crypt(crypt(input_byte, Table1), Table2)--> input_byte XOR s_code XOR s_code = input_byte
从加解密的过程来看:
A.rc4的强度是基于key和Sbox的置换
B.必须保证加密Sbox和解密Sbox的在加密解密前状态一致,而且只要保证一致,那么可以使用任意的算法扰乱加密表和解密表甚至可以用动态的Key
rc4是面向字节流的加密算法,通过在加密地过程中不断地修改变换表来达到算法强度和校验序列的完整性
(如果丢失了其中一个字节,那么所有在该字节后解密的数据都会损坏)。
加密流程:
1.1 加密表的初始化(设加密表的长度为256,事实上加密表的长度可以任意,只是在实现时256可以用一个字节表示索引)
|-----------------------------------------|
|初始化Security Box (Sbox) |---->|------------------------------------|
|(设为0~255即可,算法上没有 | | for i = 0, 255 => Sbox[i] = i |
|要求,只要和解密表一致就可以) | |------------------------------------|
|-----------------------------------------|
|
|-----------------------------------------| |-----------------------------------------------|
|通过key来扰乱Sbox,key可以是任|---->| m = n = 0, extend(key, 256 ) |
|意相量好的字符序列,它最长是 | | for i = 0, 256 |
|和Sbox的长度一样,如果它比Sbox| | m = (m + Sbox[i] + key[n+1])%256 |
|长度少,那么重复使用 | | Swap(Sbox[i], Sbox[m]) |
|-----------------------------------------| | n = (n +1 )%256 |
|-----------------------------------------------|
1.2 加密字节
|--------------------------------------------| |-----------------------------------------------|
| 在Sbox中查找加密字节,并修改 |---->| i, j = (Sbox.idx_i+1)%256, Sbox.idx_j |
| Sbox 的值 | | j = (Sbox[i] + j) % 256 |
|--------------------------------------------| | code = s[(Sbox[i] + Sbox[j]) % 256] |
| | Swap(Sbox[i], Sbox[j]) |
| | Sbox.idx_i, Sbox.idx_j = i, j |
| | return code |
| |------------------------------------------------|
|
|----------------------------------| |----------------------------------------|
|加密对应的输入字节 |---->|out_byte = in_byte XOR code |
|----------------------------------| |-----------------------------------------|
解密表的初始化过程和解密的过程完全一样,也就是说按照上面的算法生成两份表Table1和Table2,那么
input_byte = crypt(crypt(input_byte, Table1), Table2)--> input_byte XOR s_code XOR s_code = input_byte
从加解密的过程来看:
A.rc4的强度是基于key和Sbox的置换
B.必须保证加密Sbox和解密Sbox的在加密解密前状态一致,而且只要保证一致,那么可以使用任意的算法扰乱加密表和解密表甚至可以用动态的Key