2016-08-17 7 views
1

PDF 또는 실행 파일과 같은 파일을 암호화하려고하지만이를 채울 수 없습니다. Python 3에서 일련의 바이트를 어떻게 덧붙일 수 있습니까?

with('file', 'rb') as file_read: 
    line = file_read.read(n) --> n multple of 16 
    encrypt(line, key) 

가 그럼 난 내 encrypt 함수에 라인을 통과,하지만 난 16의 배수가 아닌 라인, 내 프로그램이 충돌에 도달했을 때 :

나는이 방법으로 파일을 읽어보십시오.

바이트 시퀀스를 올바르게 패드하려면 어떻게해야합니까?

+1

당신은'encrypt' 함수에 무엇을 사용하고 있습니까? – zaph

답변

2

이것은 이전 답변의 단순화 된 (편집 된) 버전입니다. 파일을 가정


사용하여 루프 판독 line = f.read(N) EOF까지 (N은 블록 크기 임).

1) 사소한 제로 패딩; 다만 read 후이 추가 :

elen = len(line) % N 
if elen: 
    line += bytes(N - elen) 

제로 패딩은 간단하지만, 단점이 있습니다.


2) PKCS # 7 패딩 N < 256; read 후이를 추가하고 확인 루프 후에 종료됩니다합니다

if len(line) < N: 
    elen = 1 + (len(line) - 1) % N 
    line += bytes(elen for _ in range(elen)) 

파일에서 읽는 것은 네트워크 소켓에서 읽기와 다른 점에 유의하시기 바랍니다. 네트워크에서 고정 된 길이의 블록을 읽으려면 버퍼가 필요합니다.

+0

데이터가 null 바이트로 끝나는 경우 해독 후 바이트를 어떻게 제거 하시겠습니까? 그래서 [PKCS # 7] (https://en.wikipedia.org/wiki/Padding_ (cryptography) # PKCS7) 패딩이 일반적으로 사용되며 특히 더 어려운 것은 아니며 단지 패딩 바이트 수를 채 웁니다. – zaph

+0

@zaph 이전 답변을 보았지만 원래 질문에 세부 사항이 부족합니다. 그래서 면책 조항으로 답변을 시작하고 가장 간단한 사례를 게시하여 몇 가지 코드를 작성했습니다. – VPfB

+0

@VPfB 파일 만 암호화하려고합니다. – apollo9

2

대부분의 암호화 구현은 패딩 옵션을 지원합니다. 일반적으로 PKCS#7 (nee PKCS # 5)은 암호화시 패딩을 추가하고 암호 해독시이를 제거합니다.

참고 : mcrypt는 PKCS # 7 패딩을 지원하지 않으므로 멀리 두십시오.