废死了劲儿终于找到一个能用的,发现原来是 lenb 和 len 以及 ascb 和 asc 等等之间的一B之差
Public Sub main() Dim key As String For i = 1 To 16 Randomize key = key & Chr ( Rnd * 255 ) Next i MsgBox RC4(RC4( " Welcome To Plindge Studio! " , key), key) End Sub Private Function RC4(ByVal inp As String , _ key As String ) As String Dim s( 0 To 255 ) As Byte , k( 0 To 255 ) As Byte , i As Long Dim j As Long , temp As Byte , y As Byte , t As Long , x As Long Dim Outp As String For i = 0 To 255 s(i) = i Next j = 1 For i = 0 To 255 If j > LenB(key) Then j = 1 End If k(i) = AscB(MidB(key, j, 1 )) j = j + 1 Next i j = 0 For i = 0 To 255 j = (j + s(i) + k(i)) Mod 256 temp = s(i) s(i) = s(j) s(j) = temp Next i i = 0 j = 0 For x = 1 To LenB(inp) i = (i + 1 ) Mod 256 j = (j + s(i)) Mod 256 temp = s(i) s(i) = s(j) s(j) = temp t = (s(i) + (s(j) Mod 256 )) Mod 256 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 = 0 To 255 s(i) = i Next j = 1 For i = 0 To 255 If j > LenB(key) Then j = 1 End If k(i) = AscB(MidB(key, j, 1 )) j = j + 1 Next j = 0 For i = 0 To 255 j = (j + s(i) + k(i)) Mod 256 temp = s(i) s(i) = s(j) s(j) = temp Next i = 0 j = 0 For x = 1 To LenB(inp) i = (i + 1 ) Mod 256 j = (j + s(i)) Mod 256 temp = s(i) s(i) = s(j) s(j) = temp t = (s(i) + (s(j) Mod 256 )) Mod 256 y = s(t) Outp = Outp & ChrB(AscB(MidB(inp, x, 1 )) Xor y) Next RC4 = Outp End Function