我尝试在python中运行spritz加密代码。它必须转换为十六进制。
是相同的代码 result = self.s.int_to_hex(self.s.hash(256, self.s.int_string("ABC"), 32))
print(result)
它没有错误,但我想将排列数组从256减少到16.所以我改变了这样的代码。
result = self.s.int_to_hex(self.s.hash(16, self.s.int_string("ABC"), 32))
print(result)
然后它会显示这样的错误。
.E
======================================================================
ERROR: test_hash (__main__.TestSpritz)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Python34/test.py", line 9, in test_hash
result = self.s.int_to_hex(self.s.hash(16, self.s.int_string("ABC"), 32))
File "C:/Python34\spritz.py", line 130, in hash
self.absorb(M)
File "C:/Python34\spritz.py", line 73, in absorb
self.absorb_byte(byte)
File "C:/Python34\spritz.py", line 68, in absorb_byte
self.absorb_nibble(self.high(b))
File "C:/Python34\spritz.py", line 63, in absorb_nibble
self.S[self.a], self.S[int(math.floor(self.N/2)+x)] = self.S[int(math.floor(self.N/2)+x)], self.S[self.a]
IndexError: list index out of range
----------------------------------------------------------------------
Ran 2 tests in 0.031s
FAILED (errors=1)
我不知道如何使用函数int_to_hex请帮助我。
这是我的代码。
test.py
import unittest
from spritz import Spritz
class TestSpritz(unittest.TestCase):
def setUp(self):
self.s = Spritz()
def test_hash(self):
result = self.s.int_to_hex(self.s.hash(16, self.s.int_string("ABC"), 32))
print(result)
self.assertEqual(result[0:16], '028FA2B48B934A18')
result = self.s.int_to_hex(self.s.hash(256, self.s.int_string("spam"), 32))
self.assertEqual(result[0:16], 'ACBBA0813F300D3A')
result = self.s.int_to_hex(self.s.hash(256, self.s.int_string("arcfour"), 32))
self.assertEqual(result[0:16], 'FF8CF268094C87B9')
def test_encryption(self):
result = self.s.array_to_string(self.s.encrypt(self.s.int_string("ABC"), [0]*8))
self.assertEqual(result, '779A8E01F9E9CBC0')
result = self.s.array_to_string(self.s.encrypt(self.s.int_string("spam"), [0]*8))
self.assertEqual(result, 'F0609A1DF143CEBF')
result = self.s.array_to_string(self.s.encrypt(self.s.int_string("arcfour"), [0]*8))
self.assertEqual(result, '1AFA8B5EE337DBC7')
if __name__ == '__main__':
unittest.main()
spritz.py
import math
from fractions import gcd
class Spritz():
alt = False
def initialize_state(self, N_input):
self.i = 0
self.j = 0
self.k = 0
self.z = 0
self.a = 0
self.w = 1
self.N = N_input
self.D = int(math.ceil(math.sqrt(self.N)))
self.S = list(range(self.N))
def low(self, b):
return b % self.D
def high(self, b):
return int(math.floor(b/self.D))
def update(self):
self.i = (self.i + self.w) % self.N
self.j = (self.k + self.S[(self.j + self.S[self.i]) % self.N]) % self.N
self.k = (self.i + self.k + self.S[self.j]) % self.N
self.S[self.i], self.S[self.j] = self.S[self.j], self.S[self.i]
def whip(self, r):
for v in list(range(r)):
self.update()
self.w = (self.w + 1) % self.N
while gcd(self.w, self.N) != 1:
self.w = (self.w + 1) % self.N
def crush(self):
for v in list(range(int(math.floor(self.N/2)))):
if self.S[v] > self.S[self.N-1-v]:
self.S[v], self.S[self.N-1-v] = self.S[self.N-1-v], self.S[v]
def alt_crush(self):
for v in list(range(int(math.floor(self.N/2)))):
x = self.S[v]
y = self.S[N-1-v]
if x > y:
self.S[v] = y
self.S[N-1-v] = x
else:
self.S[v] = x
self.S[N-1-v] = y
def shuffle(self):
self.whip(2*self.N)
self.alt_crush() if self.alt else self.crush()
self.whip(2*self.N)
self.alt_crush() if self.alt else self.crush()
self.whip(2*self.N)
self.a = 0
def absorb_nibble(self, x):
if self.a == int(math.floor(self.N/2)):
self.shuffle()
self.S[self.a], self.S[int(math.floor(self.N/2)+x)] = self.S[int(math.floor(self.N/2)+x)], self.S[self.a]
self.a = (self.a + 1) % self.N
def absorb_byte(self, b):
self.absorb_nibble(self.low(b))
self.absorb_nibble(self.high(b))
def absorb(self, I):
for v in list(range(0, len(I), 3)):
byte = int(I[v:v+3])
self.absorb_byte(byte)
def absorb_stop(self):
if self.a == int(math.floor(self.N/2)):
self.shuffle()
self.a = (self.a + 1) % self.N
def output(self):
self.z = self.S[(self.j + self.S[(self.i + self.S[(self.z + self.k) % self.N]) % self.N]) % self.N]
return self.z
def drip(self):
if self.a > 0:
self.shuffle()
self.update()
return self.output()
def squeeze(self, r):
if self.a > 0:
self.shuffle()
P = ""
for v in list(range(r)):
#P.append("%0.2X" % self.drip())
P += "%03d" % self.drip()
return P
def print_variables(self):
print ("i: " + hex(self.i))
print ("j: " + hex(self.j))
print ("k: " + hex(self.k))
print ("z: " + hex(self.z))
print ("a: " + hex(self.a))
print ("w: " + hex(self.w))
print ("D: " + hex(self.D))
print ("S: " + self.array_to_string(self.S))
#print "S: " + str(self.S)
def int_string(self, string):
key = ""
for char in string:
key += "%03d" % ord(char)
return key
def int_to_hex(self, int_string):
result = ""
for i in list(range(0, len(int_string), 3)):
result += "%0.2X" % int(int_string[i:i+3])
return result
def array_to_string(self, array):
result = ""
for i in array:
result += "%0.2X" % i
return result
def hash(self, N, M, r):
self.initialize_state(N)
self.absorb(M)
self.absorb_stop()
self.absorb_byte(r)
return self.squeeze(r)
def key_setup(self, K):
self.initialize_state(256)
self.absorb(K)
def encrypt(self, K, M):
self.key_setup(K)
Z_string = self.squeeze(len(M))
Z = [int(Z_string[i:i+3]) for i in list(range(0, len(Z_string), 3))]
C = [i + j for i, j in zip(M, Z)]
return C