废死了劲儿终于找到一个能用的,发现原来是 lenb 和 len 以及 ascb 和 asc 等等之间的一B之差
PublicSub main() Dim key AsString For i =1To16 Randomize key = key &Chr(Rnd*255) Next i MsgBox RC4(RC4("Welcome To Plindge Studio!", key), key) End Sub PrivateFunction RC4(ByVal inp AsString, _ key AsString) AsString Dim s(0To255) AsByte, k(0To255) AsByte, i AsLong Dim j AsLong, temp AsByte, y AsByte, t AsLong, x AsLong Dim Outp AsString For i =0To255 s(i) = i Next j =1 For i =0To255 If j > LenB(key) Then j =1 EndIf k(i) = AscB(MidB(key, j, 1)) j = j +1 Next i j =0 For i =0To255 j = (j + s(i) + k(i)) Mod256 temp = s(i) s(i) = s(j) s(j) = temp Next i i =0 j =0 For x =1To LenB(inp) i = (i +1) Mod256 j = (j + s(i)) Mod256 temp = s(i) s(i) = s(j) s(j) = temp t = (s(i) + (s(j) Mod256)) Mod256 y = s(t) Outp = Outp & ChrB(AscB(MidB(inp, x, 1)) Xor y) Next RC4 = Outp End Function
稍作改动,成为 ASP(VBScript) 版,貌似不能加密中文的,可能还需要一次转换
Function RC4(inp, key) Dim S(255), K(255), i Dim j, temp, Y, t , x Dim Outp For i =0To255 s(i) = i Next j =1 For i =0To255 If j > LenB(key) Then j =1 EndIf k(i) = AscB(MidB(key, j, 1)) j = j +1 Next j =0 For i =0To255 j = (j + s(i) + k(i)) Mod256 temp = s(i) s(i) = s(j) s(j) = temp Next i =0 j =0 For x =1To LenB(inp) i = (i +1) Mod256 j = (j + s(i)) Mod256 temp = s(i) s(i) = s(j) s(j) = temp t = (s(i) + (s(j) Mod256)) Mod256 y = s(t) Outp = Outp & ChrB(AscB(MidB(inp, x, 1)) Xor y) Next RC4 = Outp