문제

Serverside에서 중간에서 강한 암호화가 필요하므로 McRypt와 PHP를 사용할 것이라고 생각했습니다. 원래 문자열의 시작 부분 아래 기능을 사용하면 암호 해독 후 이진 쓰레기로 바뀝니다. (이것은 평범한 문제가 아닙니다. 추가의 쓰레기, 대신 내 끈이 있습니다 변경되었습니다.) 문서에 따르면, McRypt_encrypt ()는 선택한 알고리즘의 블록 크기와 일치하기에 충분한 문자를 채우지 않아야하지만 작동하지 않는 것으로 생각됩니다.

그러나 Rijndael의 128 비트 (16 바이트)의 블록 크기로 수동으로 패드하면 작동하지 않습니다. 이 작업을 수행 할 수있는 유일한 방법은 수비 된 블록을 덮고 해당 문자열과 내 데이터 사이에 "데이터#"과 같은 알려진 접두사를 추가 할 수있을 정도로 긴 문자열을 선물하는 것입니다. 암호 해독 후 그 블록은 부분적으로 엉망이되었지만 내 접두사와 그 이후의 모든 데이터는 올바르게 해독되었습니다.

$GLOBALS['encryptionmarker'] = 'DATA#';

function encrypt($plain, $key) {
    /*
    // workaround because beginning of decrypted string is being mangled
    // so we simply prefix with some text plus marker
    $prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
    $plain = $prefix.$plain;
    */

    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    return $encrypted;
}

function decrypt($encrypted, $key) {
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
        mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
        MCRYPT_DEV_URANDOM));

    /*
    // workaround: remove garbage
    $pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
    $decrypted = trim(substr($decrypted, $pos + strlen($GLOBALS['encryptionmarker'])));
    */

    return $decrypted;
}

내 기능에 무슨 문제가 있습니까? 왜 내 데이터를 그런 식으로 접두사해야합니까 (더러운 해결 방법이라고 생각하므로 수정하고 싶습니다)?

암호화 된 데이터를 저장하는 것은 문제가되지 않습니다. 데이터베이스에 저장하지 않고 암호화 직후에 해독하면 동일한 오류가 발생합니다.

도움이 되었습니까?

해결책

문제는 수신 측에 새롭고 다른 임의의 IV를 생성한다는 것입니다. 당신이 본 것처럼 이것은 작동하지 않습니다.

수신기는 발신자가 사용한 IV를 알아야합니다. 따라서 암호화 된 데이터와 함께 보내야하고 전달해야합니다. mcrypt_decrypt().

또한 사용해야합니다 mhash() 키 (암호화 키와 다른 키)를 사용하여 메시지를 통해 HMAC를 생성하고 수신 측에서 확인하십시오. 그렇지 않은 경우, 중간에 사람은 메시지의 일부를 감지하지 않고 사소하게 수정할 수 있습니다.

다른 팁

동일한 IV를 en- 및 암호 해독에 사용하십시오. IV는 공유 비밀이 아니지만 공유해야합니다. 상담 할 수 있습니다 위키 백과 : iv

$IV = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
      MCRYPT_DEV_URANDOM));

IV는 한 번 전송해야합니다. 각 패킷의 IV 값을 증가시킬 수 있습니다. 그러나 이것은 독립적으로 양쪽에서 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top