'RC4 加密解密（调用它一次加密，再次用相同的密钥来解密）
'sKey  密钥
'sBuf  需要加密的字符
'注意：第1个是密码，第2个是字符 
'RC4流密码加密(本地)——更新
'/ /注意:看似缺陷的实现——从CryptoAPI生成的不一样,, 
' / /不确定这是因为RSA基地和使用MD5散列(因此实现可能仍然是好的) 
'对数据加密的/ / RC4流密码。 PB实现由韦恩钻石 
'/ / RC4是variable-key-size密文流发明的Ron Rivest RSA数据安全公司在1987年。 
' / / RSADSI声称免疫微分算法和线性密码分析,似乎没有任何小周期,并且是高度非线性的。 
' / / RC4可以在大约2 ^ 1700(256 ! x 256 ^ 2)可能的状态:一个巨大的数字。 
' / /算法适用于富含(输出反馈模式):b keystream是独立的明文。 
' / /富含模式b是一个块密码的方法运行同步流密码。 它类似于循环模式,除了前面的n位 
'/ /输出块是进入队列的最右边位置。 解密的逆转这一过程。 这就是所谓的n位富含。b 
'/ /——描述Bruce Schneier的密码学应用(第二版),页397 - 8(RC4)和203年(富含模式b)。 (这是一个必备的书! 
'/ /注意RC4,像大多数流密码,容易的比特反转在攻击它没有错误检查…… 没关系! 我们自己能做到这一点。 
' / /别慌! ——比特反转在攻击不允许攻击者读取消息,但请注意他们允许_modification_的消息。 
'/ /如。 爱丽丝将“攻击1月1”发送给鲍勃,但是加密的信息是被夜修改(例如)1位在最后一个字节, 
' / /才将其发送给鲍勃。 当鲍勃现在解密消息读取subtley不同像“1月25日袭击”。 
'/ /这是一个“盲人”袭击夜,需要一点一点的运气去猜测攻击,但这种可能性仍然存在,除非我们添加自己的错误检查。 
'/ /解决方案:包括明文的密码散列前的明文加密增加了错误检测,防止此类攻击。 
'/ /如。 而不是= RC4加密(Plaintxt),我们使用加密= RC4(Plaintxt &散列(Plaintxt))… 在Hash()是任何安全散列如MD5、沙等。 
'/ /解密后的散列可以与解密数据的哈希(减去散列字节)来确保数据没有修改。 
'/ /你可以包括哈希加密后,ie。 RC4加密=((Plaintxt)和散列(Plaintxt)),但包括在加密之前增加安全性。
Function RC4(sKey as String, sBuf as String) as String  '// RC4 加密解密（调用它一次加密，再次用相同的密钥来解密）
   '// IMPORTANT: // NOT SURE IF THE "MOD"'s SHOULD BE 256 OR 255
   '// 需要使用较大的字符串对RC4等软件的输出测试
   
   Dim x as ULong, i as ULong
   Dim byte_cipher as UByte, result_ciphered as UByte, byte_msg as UByte Ptr, sOut as String, keylen as ULong, j as UByte
   Dim KBox(255) as UByte, Sbox(255) as UByte '// Key-box和S-box的每个字节尺寸，256（0～255）
   keylen = Len(sKey)
   If keylen > 256 Then keylen = 256
   memcpy @KBox(0), StrPtr(sKey), keylen
   
   '//初始化S-box。即必须通过 RC4()，每次调用。只是不能将它设置在程序启动时 ； 一次为每个解密需要 reinitialisation。
   For i = 0 To 255
      Sbox(i) = i
   Next
   For i = 0 To 255
      j = (j + Sbox(i) + KBox(i Mod keylen)) Mod 255
      Swap Sbox(i), Sbox(j)   '// 我用我自己的 ByteSwap() 为我第一次的 RC4 执行，但 ！RDTSC CPU 时间证明 PB 的本机 SWAP() 是大约 10%更快 ；归功于 PB 开发团队 ！特别是因为 SWAP() 是灵活的数据类型
   Next i
   '//编码阶段
   j = 0 : byte_msg = StrPtr(sBuf)
   For x = 1 To Len(sBuf)
      i = (i + 1) Mod 255
      j = (j + Sbox(i)) Mod 255
      Swap Sbox(i), Sbox(j)
      byte_cipher = Sbox((Sbox(i) + Sbox(j)) Mod 255)
      result_ciphered = byte_cipher Xor *byte_msg
      byte_msg += 1
      sOut = sOut & Chr(result_ciphered)
   Next x
   Function = sOut
End Function
