...
1
2
3
4
5
6
7
8
9
10 package rc4
11
12 import "strconv"
13
14
15 type Cipher struct {
16 s [256]uint32
17 i, j uint8
18 }
19
20 type KeySizeError int
21
22 func (k KeySizeError) Error() string {
23 return "crypto/rc4: invalid key size " + strconv.Itoa(int(k))
24 }
25
26
27
28 func NewCipher(key []byte) (*Cipher, error) {
29 k := len(key)
30 if k < 1 || k > 256 {
31 return nil, KeySizeError(k)
32 }
33 var c Cipher
34 for i := 0; i < 256; i++ {
35 c.s[i] = uint32(i)
36 }
37 var j uint8 = 0
38 for i := 0; i < 256; i++ {
39 j += uint8(c.s[i]) + key[i%k]
40 c.s[i], c.s[j] = c.s[j], c.s[i]
41 }
42 return &c, nil
43 }
44
45
46
47 func (c *Cipher) Reset() {
48 for i := range c.s {
49 c.s[i] = 0
50 }
51 c.i, c.j = 0, 0
52 }
53
54
55
56
57
58
59 func (c *Cipher) xorKeyStreamGeneric(dst, src []byte) {
60 i, j := c.i, c.j
61 for k, v := range src {
62 i += 1
63 j += uint8(c.s[i])
64 c.s[i], c.s[j] = c.s[j], c.s[i]
65 dst[k] = v ^ uint8(c.s[uint8(c.s[i]+c.s[j])])
66 }
67 c.i, c.j = i, j
68 }
69
View as plain text