为什么pem2der和der2pem没有反转?

时间:2016-04-08 15:41:46

标签: php

PHP's OpenSSL functions的补充评论中,有这个代码段

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看起来并不重要。

这是从哪里来的?

1 个答案:

答案 0 :(得分:1)

这些功能仅用于处理证书,而不是私钥。结果错误的原因是pem2der函数正在查找证书的开头(CERTIFICATE-----来自-----BEGIN CERTIFICATE-----)。您正在尝试解码以-----BEGIN PRIVATE KEY-----开头的密钥。结果的“TE KEY”部分来自这里:“----- BEGIN PRIVA TE KEY -----”并且是不处理该标题的函数的结果所以{ {1}}调用返回错误的结果。

理论上,这些函数应该很容易修改以处理私钥文件。