mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
48 lines
1.0 KiB
Python
48 lines
1.0 KiB
Python
|
|
class RC4:
|
|
def __init__(self):
|
|
self.state = [0] * 256
|
|
self.I = 0
|
|
self.J = 0
|
|
|
|
def init(self, key):
|
|
for i in xrange(256):
|
|
self.state[i] = i
|
|
|
|
j = 0
|
|
for i in xrange(256):
|
|
K = ord(key[i % len(key)])
|
|
S = self.state[i]
|
|
j = (j + S + K) % 256
|
|
self.swapByIndex(i, j)
|
|
|
|
def swapByIndex(self, i, j):
|
|
self.state[i], self.state[j] = self.state[j], self.state[i]
|
|
|
|
def next(self):
|
|
self.I = (self.I + 1) % 256
|
|
self.J = (self.J + self.state[self.I]) % 256
|
|
self.swapByIndex(self.I, self.J)
|
|
return self.state[(self.state[self.I] + self.state[self.J]) % 256]
|
|
|
|
def encrypt(self, data):
|
|
for i in xrange(len(data)):
|
|
data[i] = data[i] ^ self.next()
|
|
|
|
|
|
def benchRC4_internal(messageLen, iterations):
|
|
Secret = "This is my secret message"
|
|
Key = "This is my key"
|
|
LongData = [0] * messageLen
|
|
|
|
for i in xrange(messageLen):
|
|
LongData[i] = ord(Secret[i % len(Secret)])
|
|
|
|
Enc = RC4()
|
|
Enc.init(Key)
|
|
|
|
for i in xrange(iterations):
|
|
Enc.encrypt(LongData)
|
|
|
|
benchRC4_internal(5000, 100000)
|