2016-10-29 2 views
0

파이썬에서 DES 알고리즘을 연구 중이다.파이썬 이진 문자열 시프트

기능 중 하나 인 Fiestle 기능에서 사이퍼를 가져 오기 위해 XOR 요소를 사용해야합니다.

C0가 1,111,000011001100101010101,111

D0는 내가 가진 출력은 0101010101100110011110001,111

c0_d0=[] 
for i in range(1): 
    t=[] 
    t.append(C0) 
    t.append(D0) 
    c0_d0.append(t) 

#print c0_d0 

def str_to_bin(strr,shifts): 
for i in range(1,17): 
    temp=[] 
    for j in range(1): 
     temp.append(int(c0_d0[i-1][0])<<1) 
     temp.append(int(c0_d0[i-1][1])<<1) 
    c0_d0.append(temp) 

return c0_d0 

입니다 :

내가 파이썬에서 작업을 이동 수행 할 수있는 방법이 있나요은 아래 내가 노력 코드입니다 like : enter image description here

요소를 비트 이동하여 얻은 이진 문자열로 원합니다. 즉 f 첫 번째 요소 쌍은 이전 요소 쌍을 시프트하여 얻어지며 다음 요소 쌍은 이전 요소에 의해 얻어진다. 등등 0 번째 인덱스 요소가 주어진다.

예 C0는 1,111,000011001100101010101,111 D0가 0101010101100110011110001,111

C1은 1,110000110011001010101011110 같다 C0 < < 1이어야이다

D1은 1,010101011001100111100011110

+0

이진 문자열을 이동 하시겠습니까? 나는 크기가 28 비트라고 가정합니다 (크기를 지정하지 않았습니다, 파이썬에서는 int 내부 표현에 의존 할 수 없습니다). 이 경우'C1 = C0 [1 :] + "0"'을 시도하십시오. 그러나 당신의 질문은 정말로 불분명합니다. –

+0

이진 연산을 수행하려면 정수 또는 바이트 수를 사용하십시오 (정수 목록). 문자열 연산을 사용하는 것이 편안하거나 효과적이지 않습니다. –

답변

0

10 진수 또는 문자열로 인코딩 된 2 진수를 사용하지 마십시오. 숫자를 그대로 사용하는 것이 훨씬 효율적이며 일관성이 있으며, Python은 다른 숫자로 또는 숫자를 변환하는 것을 지원합니다.

>>> C0=0b1111000011001100101010101111 
>>> bin(C0<<1) 
'0b11110000110011001010101011110' 
하는 L이 출력에서 ​​오는, 또는 단순히 int에서 어디 파이썬은 파이썬 2 long라는 임의의 큰 정수 (에 대한 지원을 가지고 같은,하지만 어느 시점에서 당신의 크기를 제한 할 수 있습니다

파이썬 3). 이는 일반적으로 비트 마스킹을 통해 수행됩니다. 특정 기준에 결과를 표시하려면 특정 너비로 ​​서식을 지정할 수도 있습니다.

>>> bin(C0 & ((1<<16)-1)) # truncate to 16 bits 
'0b1100101010101111' 
>>> '{:032b}'.format(C0) # format as 32 digit binary string 
'00001111000011001100101010101111' 

예제 출력에는 문자열과 숫자 형식의 데이터가 혼합되어 있습니다.

다음은 문자열에서 바이너리를 파싱하는 방법에 대한 예입니다. 프로그램에서이를 입력으로 받아 들일 수 있으며 더 직접적인 형식 지정을 수행 할 수 있습니다.

>>> D = int('0101010101100110011110001111', 2) # parse as binary = base 2 
>>> D 
89548687 
>>> format(D, '032b') 
'00000101010101100110011110001111' 
0

같다 D0 < < 1이어야 내 왼쪽 쉬프트의 정의는 표준이 아니다 (2를 곱한다). 문자열로 쉽게 에뮬레이션 할 수 있습니다.

C = '1111000011001100101010101111' 
D = '0101010101100110011110001111' 

def shstr(string): 
    return string[1:]+'0' 

zeroes = ''.join(['0' for _ in range(len(C))]) 
while C != zeroes or D != zeroes: 
    print C,D 
    C = shstr(C) 
    D = shstr(D) 

또는 이것을 함수 및 수율에 넣습니다.

+0

정수 오버플로 플래그를 x86에 언급하고 (답안에서 해결책이 부족함) 나에게 좋을 것입니다. – agg3l

+0

무슨 뜻입니까? 오버플로가 예상되는 곳은 어디입니까? 문자열은 여기서는 꽤 짧습니다 (위의 솔루션에는 int가없고 문자열 만 있습니다). – kabanus

+0

질문자가 말한대로 DES 알고리즘은 문자열 조작으로 구현되지 않습니다. 그렇습니까? 문자열을 이동하고 정수를 이동하는 것은 많이 다릅니다 (결과를 해석하는 데 많은주의를 기울여야 함). 그 후 당신의 솔루션에 뉘앙스가 있다고 언급했습니다. – agg3l