2017-02-13 17 views
2

내 문자열을 32 자 길이로 직접 채우면 코드가 작동합니다.
제 질문은 : openSSL 패드에 데이터를 저장하는 방법이 있습니까? 아니면 항상해야합니까?openssl_encrypt를 입력을 필요한 블록 크기로 채우려면 어떻게해야합니까?

작업 :

openssl_encrypt ("my baba is over the ocean1111111", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV); 

작동하지 :

openssl_encrypt ("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV); 

나는 현재 자기 패딩에 의해이 문제를 해결 :

누가 복음 공원으로
$pad = 32 - (strlen("my baba is over the ocean") % 32); 
$clear = "my baba is over the ocean" . str_repeat(chr($pad), $pad); //encrypt this string 
+1

AES에 필요한 블록 크기가 나는 기계를 혼란 0의 패딩의 선택을 추측하고있어 (16)이다. – jww

+1

현재 패딩이없는 곳에 대신 패딩 구성표로 의도적으로 PKCS5를 사용할 수 있습니까? –

+0

@ 루크 파크 (LukePark)는 그것을 할 수있는 방법으로 만들어져 있습니까? btw -> notice 나는 블럭을 0으로 채우지 않고 직접 덧붙인다. –

답변

2

말했다 대신 명시 적으로 사용하는 openssl_encrypt 말의 OPENSSL_ZERO_PADDING, 단순히 매개 변수에서 해당 옵션을 제거하면 def PKCS #7 padding scheme을 찾으십시오 (나머지 블록을 0x0n으로 채우십시오. 여기서 n은 필요한 바이트 수입니다. 블록이 이미 완료된 경우 + 0x00). 주 : Luke와 PKCS # 7이 참조한 PKCS # 5는이 시나리오에서 사실상 동일합니다. PHP docs에서

:

OPENSSL_ZERO_PADDING을 사용하지 않고, 자동으로 PKCS 번호 7 패딩을 얻을 것이다.

그래서 당신은 호출해야합니다 :

openssl_encrypt("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY, OPENSSL_RAW_DATA, $MY_IV); 
+2

나를 혼란스럽게 만든 것은 이름이었다. 나는 ZERO로 패딩을한다는 것을 의미한다고 생각했다. 진실로 그것은 아무런 덧붙임도 의미하지 않았습니다. –