2015-01-20 2 views
-2

윤곽선이 표시된 here으로 PVKS를 구현하고 있습니다. 필자는 기사에서 제시된대로 작동하지만 (PHP에서는), 필자는 수행 방법을 알아 내려고하는 추가 요구 사항이 있습니다. 생성 된 코드에 날짜와 3 자리 숫자를 어떻게 포함시켜야 하는지를 파악하려고합니다. 나는 여기서부터 시작해야할지 모르겠다. 그래서 솔직히 아무 것도 시도하지 않았다. 불행히도 조합에서는 고유하지 않으므로 시드 값으로 해시 할 수는 없습니다. 내가 할 수있는 한 getKeyByte 함수의 일부가 될 수 없다. 그 함수에 대한 입력은 유효한 키의 알고리즘을 정의하는 seed 및 일부 인수 만 사용해야한다. 생성기와 유효성 검사기는 정적이어야하므로 생성기와 유효성 검사기간에 동일해야합니다. 이런 종류의 업무에 대해 수락 된 관행이 있습니까?일련 번호로 데이터 임베딩

+0

@close voter - 내가 정리할 수있는 특정 문제가 있습니까? 아니면 ...? –

답변

0

직접 관리해보세요. 나는 내가 키 바이트에 값을 인코딩 할 수있는 방법을 찾으려고 노력하면서 물건을 복잡하게 만들었다는 것을 깨달았다. 이 작업을 수행하는 방법은 (잘, 내가 한 것처럼) 키 바이트 다음과 체크섬 앞에 여분의 바이트를 추가하는 것입니다. 다른 키 바이트처럼 유효성을 검사 할 필요는 없지만 체크섬에 영향을 미칩니다.

다음은 필자가 추가하고 싶은 새로운 섹션이있는 키 생성 및 유효성 검사와 관련된 클래스입니다.

static public function generateKey($extraKeyArgs = array(), $encodedData = array()) 
{ 
    $args = self::instanceKeyArgs($extraKeyArgs); 
    $keyBytes = array(); 
    $seed = self::getSeed(); 
    $hexSeed = self::intToHex($seed,self::$seedWidth); 
    $key = $hexSeed; 
    $numKeys = count($args); 

    for ($i=0; $i < $numKeys; $i++) { 
     list($a, $b, $c) = $args[$i]; 
     $keyBytes[$i] = self::getKeyByte($seed, $a, $b, $c, self::$keyWidthBytes); 
     $key .= self::intToHex($keyBytes[$i],self::$keyWidthHex); 
    } 

    // Section added to handle encoded data 
    foreach ($encodedData as $data) { 
     // Make $data an integer value, one byte wide. 
     $data = (((int) $data) & 255); 
     $keyBytes[] = $data; 
     $numKeys++; 
     $key .= self::intToHex($data,self::$keyWidthHex); 
    } 
    // End Section 

    $checksum = self::getChecksum($key); 

    $key = $hexSeed . self::$seperator; 
    for ($i=0; $i < $numKeys; $i++) { 
     $key .= self::intToHex($keyBytes[$i],self::$keyWidthHex); 
     if ($i & 1) { 
      $key .= self::$seperator; 
     } 
    } 

    if (substr($key, -1) !== self::$seperator) { 
     $key .= self::$seperator; 
    } 

    $key .= $checksum; 

    return $key; 
} 

static public function checkKey($key, $extraKeyArgs = array(), &$data = array()) 
{ 
    $args = self::instanceKeyArgs($extraKeyArgs); 
    $numKeys = count($args); 

    if (!self::checkKeyChecksum($key)) { 
     return false; // Failed checksum! Maybe a mistype or optical reader error? 
    } 

    $key = self::normalizeKey($key); 

    // TODO - we would check against a blacklist here if we wanted to implement that. 

    $seed = hexdec(substr($key,0,self::$seedWidth)); 
    if (!is_int($seed) || $seed < 1) { 
     return false; // Failed to get seed. Are you sure this key came from here? 
    } 

    $key = substr($key, self::$seedWidth, (strlen($key) - (self::$seedWidth + self::$checksumWidth))); 
    for ($i=0; $i < $numKeys; $i++) { 
     $keyByte = substr($key, 0, self::$keyWidthHex); 
     $key = substr($key, self::$keyWidthHex); 
     list($a, $b, $c) = $args[$i]; 
     if ($keyByte !== self::intToHex(self::getKeyByte($seed, $a, $b, $c, self::$keyWidthBytes),2)) { 
      return false; // Key byte failed check. Possible forgery attempt? 
     } 
    } 

    // This line added to handle encoded data 
    $data = array_map('hexdec', str_split($key, self::$keyWidthHex)); 

    return true; // Valid Key, Yay! 
} 
관련 문제