2017-05-23 16 views
1

저는 멍청한 개발자입니다. 일부 데이터의 해독을 시도하고 있지만 PHP에서 OpenSSL을 사용할 때 응답이 없습니다. 또한 데이터 암호화를 시도 할 때 OpenSSL은 문자 블록을 추가합니다.AES-256-CBC 암호화/해독 16 진수 문자열 PHP에서 openssl 사용

<?php 
    $dataToDecrypt = hex2bin("C2E5CDFE8BBFBC7350D40538434824DD3E11520B89A5BFDE24FA064DB2EED6EA"); 
    $aesKey = hex2bin("E3FB8EA130722FA99266B96B77C2735C39393939393939393920202020202020"); 
    $iv = hex2bin("00000000000000000000000000000000"); 
    $result = openssl_decrypt($dataToDecrypt, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv); 
    echo bin2hex($result); 
?> 

$result가 있어야하는데 : : 나는 VB에서, 심지어 AES encription 웹 페이지 (http://aes.online-domain-tools.com/)과이 시도했습니다

C3A6149C73FFBE4EAD36DC62FE40877D17CD690F37B06058CA3D65A345CC8212 

코드입니다 결과가 정확합니다. 하지만 PHP로 시도 할 때 대답이 없습니다.

동일한 정보로 암호화 할 때 암호화 된 데이터가 다른 것으로 나타났습니다. 나는 결과가 암호화되면

<?php 
    $dataToEncrypt = hex2bin("C3A6149C73FFBE4EAD36DC62FE40877D17CD690F37B06058CA3D65A345CC8212"); 
    $aesKey = hex2bin("E3FB8EA130722FA99266B96B77C2735C39393939393939393920202020202020"); 
    $iv = hex2bin("00000000000000000000000000000000"); 
    $result = openssl_encrypt($dataToEncrypt, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA, $iv); 
    echo bin2hex($result); 
?> 

:

C2E5CDFE8BBFBC7350D40538434824DD3E11520B89A5BFDE24FA064DB2EED6EA3A3ED407DC78D6AF9030BAB90CB40EAD 

나는 (3A3ED407DC78D6AF9030BAB90CB40EAD) 예상보다 32 자 이상을 받기는 코드입니다. VB에서 암호화하거나 앞서 언급 한 웹 페이지를 사용하면 32 개의 추가 문자를 얻지 못합니다.

왜 이런 일이 발생합니까? 내가 놓친 게 있니? 나는 며칠 동안 답을 찾고 있었다. 어떤 도움을 주셔서 감사합니다.

+0

작은 따옴표 대신 백틱 : \'을 사용하여 인라인 코드를 강조 표시 할 수 있습니다. 귀하의 영어는 괜찮지 만 OpenSSL 및 PHP와 같은 이름에 대문자를 사용하면 질문을보다 전문적으로 보이게하는 것이 좋습니다. 변경 사항을 보려면 [this] (https://stackoverflow.com/posts/44140853/revisions)를 클릭하십시오. –

답변

1

PHP 암호 해독 중에 뭔가를 보려면 경고 메시지를 켜야합니다.

기본적으로 openssl_decrypt 호출은 먼저 암호문의 암호를 해독합니다. 암호문이 16 ​​바이트의 배수 (AES의 블록 크기)이면 항상 성공합니다. 그런 다음 PKCS # 7 호환되지 않은 패딩을 시도하고 수행하며 실패 할 가능성이 큽니다. 처리되지 않도록하려면에서 OPENSSL_RAW_DATA까지 OPENSSL_ZERO_PADDING을 추가로 사용하십시오.

암호화 기능은 물론 마찬가지입니다. 현재 의 암호문을 일반 텍스트로 채 웁니다. 입력 된 일반 텍스트가 블록 크기의 배수이고 샘플 코드에있는 경우 정확히 한 블록의 여백을 추가합니다. 그래서 OPENSSL_ZERO_PADDING도 필요합니다.

+0

테스트하지 않았으므로 문제가 해결되면 알려주십시오. –

+0

명확히하기 위해,'OPENSSL_ZERO_PADDING'과'OPENSSL_RAW_DATA' (실제로 올바른 출력을 생성)를 가능하게하기 위해서'3'을 ('$ options'와 같이) 사용할 수 있습니다. –

+0

@MaartenBodewes 감사합니다. 나는 그것을 테스트하고 작동합니다. –