그래서 저는 현재 도서관에서 일하고 있습니다 : simple-crypt.
특정 입력 문자열을 이진 문자열로 변환했습니다.
pw_data = input("Please type in your p!") # enter password
pw_data_confirmed = input("Please confirm!")
_platform = input("Please tell me the platform!") # belonging platform
if pw_data == pw_data_confirmed: # check confirmed pw
print("Received!")
salt_data = "AbCdEfkhl" # salt key
ciphertext = encrypt(salt_data, pw_data.encode("utf8")) # encrypt pw with salt key
바이너리 문자열 예 : b'sc \ x00 \ x02X \ xd8 \ x8ez \ xbfB \ x03s \ xc5 \ x8bm \ xecp \ x19 \ x8d \ xd6lqW \ xf1 \ xc3 \ xa4y \ x8f \ x1aW) \ x9bX \ xfc \ x0e \ xa4 \ xf2ngJj /] {\ x80 \ x06- \ x07 \ x8cQ \ xeef \ x0b \ x02? \ x86 \ x19 \ x98 \ x94eW \ x08} \ x1d8 \ xdb \ xe57 \ xf7 \ x97 \ x81 \ xb6 \ xc7 \ x08 \ n ^ \ xc9 \ xc0 '
이 바이너리 문자열은 워드 문서에 저장됩니다.
이제 문제는 다음과 같습니다. 문서를 읽고이 특정 이진 문자열을 얻으면 더 이상 이진 문자열로 인식하지 못합니다. 대신 이제 데이터 유형 문자열입니다.
p_loc = input("Which platform do you need?")
doc_existing = docx.Document(r"xxx")
text = []
for i in doc_existing.paragraphs:
text.append(i.text)
for pos,i in enumerate(text):
if i == p_loc:
len_pos = len(text[pos+1])
p_code = text[pos+1][2:len_pos-1] # get the binary string which is of type ordinary string
print(p_code.encode("utf8")) # when I apply .encode , another \ is added so I have for my binary code two \\
salt_data = "AbCdEfkhl"
plain = decrypt(salt_data, p_code)
print(plain)
.encode 문이없는 p_code (바이트 문자열이 아닌 문자열로!) : sc \ x00 \ x02X \ xd8 \ x8ez \ xbfB \ x03s \ xc5 \ x8bm \ xecp \ x19 \ x8d \ xd6lqW \ xf1 \ xc3 \ xa4y \ x8f \ x1aW ) \ x9bX \ xfc \ x0e \ xa4 \ xf2ngJj /] {\ x80 \ x06- \ x07 \ x8cQ \ xeef \ x0b \ x02? \ x86 \ x19 \ x98 \ x94eW \ x08} \ x1d8 \ xdb \ xe57 \ xf7 \ x97 \ x81 \ xb6 \ xc7 \ x08 \ n ^ \ xc9 \ xc0
이제 p_code.encode ( "utf8")를 인쇄하면 다음과 같은 결과가 나타납니다. b'sc \\ x00 \\ x02X \\ xd8 \\ x8ez \\ xbfB \\ x03s \\ xc5 \\ x8bm \\ xecp \ \ x19 \\ x8d \\ xd6lqW \\ xf1 \\ xc3 \\ xa4y \\ x8f \\ x1aW) \\ x9bX \\ xfc \\ x0e \\ xa4 \\ xf2ngJj /] {\\ x80 \\ x06- \ \ x07 \\ x8cQ \\ xeef \\ x0b \\ x02? \\ x86 \\ x19 \\ x98 \\ x94eW \\ x08} \\ x1d8 \\ xdb \\ xe57 \\ xf7 \\ x97 \\ x81 \ \ xb6 \\ xc7 \\ x08 \\ n ^ \\ xc9 \\ xc0 '
따라서 문제는이 두 번째 이진 문자열을 원래 이진 문자열과 비교하면 두 번째 이진 문자열에 \가 추가된다는 것입니다. 결과적으로이 이진 문자열을 원래 이진 코드 문자열로 인식하지 못하므로 디코딩 할 수 없습니다.
그래서 내 질문은 : 이미 이진 스타일의 문자열을 이진 문자열로 다시 변환하여 동일하게 만드는 캐주얼 한 방법이 있습니까? 아니면 원래 이진 문자열을 다시 가질 수 있도록 두 번째 \를 제거 할 수있는 방법이 있습니까?
도움을 주셔서 감사합니다 !!
확인. 그래서 당신이 f"{ciphertext}"
할 때 파이썬에게 그 바이트 의 문자열 표현 을 텍스트로 문서 에 저장하도록 지시 합니다.
예
>>> b = b"\x00\x01\x65\x66"
>>> print(f"{b}")
b'\x00\x01ef'
당신은 (아마) b'\x00\x01ef'
당신의 워드 문서 에 저장하고 싶지 않을 것 입니다. 이진 데이터를 텍스트 형식으로 저장하는 좋은 일반적인 방법은 다른 인코딩을 사용하는 것입니다. Base64는 이진 데이터를 텍스트 기반 형식으로 저장하기 위해 일반적으로 사용되는 인코딩입니다.
자세한 내용은 https://docs.python.org/3/library/base64.html 을 참조 하세요 .
귀하의 경우에는 다음과 같이하십시오.
import base64
cipher_b64_b = base64.b64encode(ciphertext)
cipher_b64 = cipher_b64_b.decode() # cipher_b64 is now a string.
# Now store this cipher_b64 string in your word document
...
# Now you fetch p_code (which is now a base64 string) from your word doc
cipher_b64_b = p_code.encode()
cipher = base64.b64decode(cipher_b64_b)
이로 인해 원래 이진 암호문이 생성됩니다. 워드 문서에는 "AAFlZg =="와 같은 base64 인코딩 문자열이 포함되어 워드 문서에서 이스케이프 시퀀스 등의 문제를 방지합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다