2012-06-21 3 views
13

파이썬 2.7을 사용하고 있습니다. 암호화/암호 해독을 수행하고자하는 영숫자 문자열이 있습니다. 내가하는 일은 양방향으로 유지되어야하며 그 결과도 영숫자 여야합니다. 내가 무슨 짓을파이썬 : 양방향 영숫자 암호화

str = 'ma6546fbd' 
encrypted_data = encrypt_function(str) 
decrypted_data = decrypt_function(encrypted_data) 
print decrypted_data # I get 'ma6546fbd' 

를 : : 예를 들어

내가 함수

def xor_crypt_string(data, key): 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(data, cycle(key))) 

이 데이터와 키를 취를 작성하고 결과를 반환은 문제는 특수 문자도 포함되어 있으므로 피하고 싶습니다.

+2

나만의 암호화를 발명해야 할 충분한 이유가 있습니까? –

+2

그는 거의 아무것도하지 않고있다. 단지 XOR이다. – mhawke

+0

나는 ASE와 같은 메커니즘을 시도했지만, 그것들에도 특수 문자가있다. 내가 말했듯이 json obj로 사용자에게 전송 될 영숫자 문자열이 필요합니다. 위의 코드는 단순한 XOR 연산입니다. –

답변

33

심각한 암호화 (읽기가 깨지지 않는 읽기)를 원하면 의 AES을 사용하십시오.

>>> from Crypto.Cipher import AES 
>>> from Crypto import Random 
>>> key = b'Sixteen byte key' 
>>> iv = Random.new().read(AES.block_size) 
>>> cipher = AES.new(key, AES.MODE_CFB, iv) 
>>> msg = iv + cipher.encrypt(b'Attack at dawn') 
>>> msg.encode("hex") 
'e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 

이것은 사용자의 ASCII 메시지입니다. 이제 자신이 전문가에 의해 쉽게 깨뜨릴 수있을 것 구성이

>>> recv='e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 
>>> cipher.decrypt(recv.decode("hex"))[len(iv):] 
'Attack at dawn' 
>>> 

모든 암호화 방법과 위에 표시된 해당 범주에 속하는 한 것과 같은 메시지를 디코딩.

+0

임의의 키를 사용하는 XOR 암호화는 깨지지 않을 것이라고 생각했습니다. 문제는 핵심 관리입니다. 아직도 AES와 같은 문제가 있습니까? – mhawke

+0

+1 빠른 재교육 후, 내가 말한 것은 사실 일 수 있지만 XOR 암호화를 사용하는 주요 관리는 AES보다 다루기 쉽지 않고 어렵습니다. XOR은 알려진 일반 텍스트 공격에도 취약합니다. – mhawke

+4

키를 한 번만 사용하면 모든 메시지마다 다른 키가되므로 올바른 것입니다. 이것은 일회용 패드입니다. 그러나 한 번 패드는 당신이 메시지와 같은 중요한 정보를 저장할 필요가 있기 때문에 실제로 불편합니다. 그리고 그것은 미리 발신자와 수신자에게 동의해야합니다! AES를 사용하면 모든 메시지에 대해 동일한 키를 사용할 수 있으며 아무도 키없이 메시지를 해독 할 수 없다는 것이 확실합니다. –

2

영숫자 기준은 어느 정도입니까?

기존 암호화 기능의 결과를 base64 인코딩하는 것은 어떻습니까? 결국 길잃은 '='패딩 문자로 끝날 수도 있지만, 이것을자를 수 있고 여분의 패딩을 계산하고 처리 할 수 ​​있습니다.

def xor_crypt_string(plaintext, key): 
    ciphertext = ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(plaintext, cycle(key))) 
    return ciphertext.encode('base64') 

def xor_decrypt_string(ciphertext, key): 
    ciphertext = ciphertext.decode('base64') 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(ciphertext, cycle(key))) 
+0

다른 대답으로 제안 된 것처럼 base64 대신 16 진 인코딩을 사용할 수 있습니다. – mhawke

+0

피곤해서 결과에 많은 특수 문자가 포함되어 있습니다. 나는이 영숫자 문자열을 json으로 인코딩하여 사용자에게 보내야합니다. 특수 문자로 재생할 수 없음 –

+0

그런 다음 .encode ('hex')를 사용하면 0-9와 a-f 만 포함하는 문자열이됩니다. 닉 크레이그 우드의 대답을 진지하게 고려해야합니다. – mhawke

관련 문제