首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么pem2der和der2pem不是倒数?

为什么pem2der和der2pem不是倒数?
EN

Stack Overflow用户
提问于 2016-04-08 23:41:46
回答 1查看 153关注 0票数 0

PHP's OpenSSL functions的补充注释中有以下代码片段

代码语言:javascript
复制
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;
}

这些函数不是逆函数。我的测试代码:

代码语言:javascript
复制
$priv_key = ...;

print $priv; // dev data, of course

print der2pem (pem2der ($priv));

打印

代码语言:javascript
复制
-----BEGIN PRIVATE KEY-----
MIIJQwIBADANBgkqhkiG9w0BAQEFAAS... (etc)

然后

代码语言:javascript
复制
-----BEGIN CERTIFICATE-----
TEKEYMIIJQwIBADANBgkqhkiG9w0BAQEFA... (etc)

注意,第二个有一个TEKEY前缀。在十六进制中,这是4c4284,看起来并不重要。

这是从哪里来的?

EN

回答 1

Stack Overflow用户

发布于 2016-04-09 05:13:24

这些函数仅用于处理证书,而不是私钥。结果错误的原因是因为pem2der函数正在查找证书的起始位置(来自-----BEGIN CERTIFICATE-----CERTIFICATE-----)。您正在尝试解码以-----BEGIN PRIVATE KEY-----开头的密钥。结果的"TE KEY“部分来自这里:”-BEGIN PRIVATE KEY-“,这是由于函数没有处理该标头,因此substr调用返回了错误的结果。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36503814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档