2013-12-17 34 views
0

我想用我的卑微的蟒蛇知識,建立一個DES代碼bitarray需要將Bn或l1轉換爲bitarray?如何?轉換列表在Python

from bitarray import bitarray 
iptable=[57, 49, 41, 33, 25, 17, 9, 1, 
     59, 51, 43, 35, 27, 19, 11, 3, 
     61, 53, 45, 37, 29, 21, 13, 5, 
     63, 55, 47, 39, 31, 23, 15, 7, 
     56, 48, 40, 32, 24, 16, 8, 0, 
     58, 50, 42, 34, 26, 18, 10, 2, 
     60, 52, 44, 36, 28, 20, 12, 4, 
     62, 54, 46, 38, 30, 22, 14, 6 
    ] 
pc1=[56, 48, 40, 32, 24, 16, 8, 
      0, 57, 49, 41, 33, 25, 17, 
      9, 1, 58, 50, 42, 34, 26, 
     18, 10, 2, 59, 51, 43, 35, 
     62, 54, 46, 38, 30, 22, 14, 
      6, 61, 53, 45, 37, 29, 21, 
     13, 5, 60, 52, 44, 36, 28, 
     20, 12, 4, 27, 19, 11, 3 
    ] 
expTable=[31, 0, 1, 2, 3, 4, 
     3, 4, 5, 6, 7, 8, 
     7, 8, 9, 10, 11, 12, 
     11, 12, 13, 14, 15, 16, 
     15, 16, 17, 18, 19, 20, 
     19, 20, 21, 22, 23, 24, 
     23, 24, 25, 26, 27, 28, 
     27, 28, 29, 30, 31, 0] 
pc2 = [13, 16, 10, 23, 0, 4, 
     2, 27, 14, 5, 20, 9, 
     22, 18, 11, 3, 25, 7, 
     15, 6, 26, 19, 12, 1, 
     40, 51, 30, 36, 46, 54, 
     29, 39, 50, 44, 32, 47, 
     43, 48, 38, 55, 33, 52, 
     45, 41, 49, 35, 28, 31] 
# The (in)famous S-boxes 
__sbox = [ 
     # S1 
     [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 
     0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 
     4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 
     15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13], 

     # S2 
     [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 
     3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 
     0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 
     13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9], 

     # S3 
     [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 
     13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 
     13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 
     1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12], 

     # S4 
     [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 
     13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 
     10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 
     3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14], 

     # S5 
     [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 
     14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 
     4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 
     11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3], 

     # S6 
     [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 
     10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 
     9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 
     4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13], 

     # S7 
     [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 
     13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 
     1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 
     6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12], 

     # S8 
     [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 
     1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 
     7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 
     2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11], 
    ] 
msg= bitarray(endian='little') 
msg.frombytes(b'ABCDEFGH') 
perm = bitarray(endian='little') 
key= bitarray(endian='little') 
key.frombytes(b'FFQQSSMM') 
keyPc1 = bitarray(endian='little') 
keyPc2 = bitarray(endian='little') 
exp = bitarray(endian='little') 
for z in pc1: 
    keyPc1.append(key[z]) 
c0 = keyPc1[0:28] 
d0 = keyPc1[28:] 
key0 = c0 + d0 
#permutation of key 
for k in pc2: 
    keyPc2.append(key0[k]) 
#permutation of message 
for x in iptable: 
    perm.append(msg[x]) 
l1 = perm[0:32] 
r1 = perm[32:] 
#Expansion of R 
for y in expTable: 
    exp.append(r1[y]) 
#XORing R & key 
xor_rk = keyPc2^exp 
#Working with S-boxes! 
B = [xor_rk[0:6], xor_rk[6:12], xor_rk[12:18], xor_rk[18:24], xor_rk[24:30], xor_rk[30:36], xor_rk[36:42], xor_rk[36:]] 
j = 0 
Bn = [0] * 32 
pos = 0 
while j < 8: 
    # Work out the offsets 
    m = (B[j][0] << 1) + B[j][5] 
    n = (B[j][1] << 3) + (B[j][2] << 2) + (B[j][3] << 1) + B[j][4] 
    # Find the permutation value 
    v = __sbox[j][(m << 4) + n] 
    # Turn value into bits, add it to result: Bn 
    Bn[pos] = (v & 8) >> 3 
    Bn[pos + 1] = (v & 4) >> 2 
    Bn[pos + 2] = (v & 2) >> 1 
    Bn[pos + 3] = v & 1 
    pos += 4 
    j += 1 
print (Bn) 
print (l1) 
xor_lf = l1^Bn 
+3

你能提供一個更小的工作樣本? –

回答

1

這裏的問題是,Bn是類型列表,而l1是類型bitarray。 一個簡單的解決方法是在創建它之後將Bn轉換爲一個bitarray。 後,

Bn = [0] * 32 

加,

Bn = bitarray(Bn)