<2>创建临时向量T(256位),如果密钥K的长度为256位,则直接将K赋给T,否则一直重复复制K,直到填满256位的向量T。 伪代码: for i=0 to255 do: s[i]=i; T[i]=k[i mod keylen]
<3>接下来使用T向量来产生S的初始排列。 这个过程从S[0]开始一直处理到S[255],同时对每个S[i],根据T[i]指定的方案将S[i]与S的另一个元素进行交换 伪代码: j=0; for i to 255 do: j= (j+s[i]+T[i]) mod 256; Swap(s[i],s[j]); 由于上述过程对S的唯一操作就是元素交换,因此S仍然是包含0~255所有元素的排列组合。
<4>密码流的产生 一旦S向量的初始排列完成后,密钥就不再被使用。接下来就是使用S自身来不断输出伪随机密码流的过程了 伪代码: i,j=0; while(True): i = (i + 1) mod 256; //i 不断从0~255循环 j = (j + S[i] ) mod 256; Swap (S[i], S[j]); //每产生一个k都重新排列S t = (S[i] + S[j]) mod 256; k = S[t]; //获取S中的一个随机元素作为密码流字节
def s_box_a():#生成sbox s=[] for i in range(256): s.append(i) return s
def key_padding(key):# 填充密钥 k=[0]*256 for i in range(256): k[i]=key[(i)% len(key)] return k
def s_box(s,key):#sbox与密钥混合 j=0 for i in range(256): j=(j+s[i]+ord(key[i]))%256 s[j],s[i]=s[i],s[j] return s
def main(): #加密 messages=raw_input("please enter message:")#输入明文 key1=raw_input("please enter key:")#输入密钥 key=[] for i in range(len(key1)): key.append(key1[i]) key=key_padding(key) sbox=s_box(s_box_a(),key) i=j=0 c="" for x in range(len(messages)): i = (i+1)%256 j = (j+sbox[i])%256 sbox[i],sbox[j]=sbox[j],sbox[i] t=(sbox[i]+sbox[j])%256 c+=chr(ord(messages[x])^sbox[t]) print b64encode(c)
def s_box_a():#生成sbox s=[] for i in range(256): s.append(i) return s
def key_padding(key):# 填充密钥 k=[0]*256 for i in range(256): k[i]=key[(i)% len(key)] return k
def s_box(s,key):#sbox与密钥混合 j=0 for i in range(256): j=(j+s[i]+ord(key[i]))%256 s[j],s[i]=s[i],s[j] return s
def main(): #解密 cipher=b64decode(raw_input("please enter cipher:"))#输入密文 key1=raw_input("please enter key:")#输入密钥 key=[] for i in range(len(key1)): key.append(key1[i]) key=key_padding(key) sbox=s_box(s_box_a(),key) i=j=0 m="" for x in range(len(cipher)): i = (i+1)%256 j = (j+sbox[i])%256 sbox[i],sbox[j]=sbox[j],sbox[i] t=(sbox[i]+sbox[j])%256 m+=chr(ord(cipher[x])^sbox[t]) print m