2016-04-08 66 views
0

在爲PHP's OpenSSL functions補充意見有這個片段pem2der和der2pem爲什麼不相反?

function pem2der($pem_data) { 
    $begin = "CERTIFICATE-----"; 
    $end = "-----END"; 
    $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin)); 
    $pem_data = substr($pem_data, 0, strpos($pem_data, $end)); 
    $der = base64_decode($pem_data); 
    return $der; 
} 

function der2pem($der_data) { 
    $pem = chunk_split(base64_encode($der_data), 64, "\n"); 
    $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; 
    return $pem; 
} 

這些功能都沒有逆。我的測試代碼:

$priv_key = ...; 

print $priv; // dev data, of course 

print der2pem (pem2der ($priv)); 

打印

-----BEGIN PRIVATE KEY----- 
MIIJQwIBADANBgkqhkiG9w0BAQEFAAS... (etc) 

然後

-----BEGIN CERTIFICATE----- 
TEKEYMIIJQwIBADANBgkqhkiG9w0BAQEFA... (etc) 

注意第二個有一個TEKEY前綴。在十六進制這是4c4284這看起來並不重要。

這是從哪裏來的?

+0

這不是官方的PHP代碼。如果你不喜歡它,也許寫你自己的?我敢打賭,無論如何,你現在要做的是更好的支持 – Machavity

回答

1

這些函數僅用於處理證書,而不是專用密鑰。結果錯誤的原因是因爲pem2der函數正在尋找證書的開始(CERTIFICATE----------BEGIN CERTIFICATE-----)。您正嘗試解碼以-----BEGIN PRIVATE KEY-----開頭的密鑰。結果的「TE KEY」部分來自這裏:「----- BEGIN PRIVA TE KEY -----」並且是不處理該頭部的功能的結果,因此substr調用返回錯誤的結果。

理論上,函數應該很容易修改以處理私鑰文件。

相關問題