相关文章推荐
忧郁的豆芽  ·  Excel - ...·  2 年前    · 
逃跑的高山  ·  OpenGL 使用 Shader 实现 ...·  2 年前    · 
玉树临风的楼房  ·  python ...·  2 年前    · 

详细的PEM文件格式解析

PEM文件 ,是按照私钥的ASN.1的格式(RFC5208/5915/5480)进行DER编码后输出二进制串的基础上,再进行Base64的编码,也就是每6个bit为一组,生成一个ascii码字符,需要4组6个bit,凑出4个ascii码字符;如果不足4组,需要补零,补零部分编码为“=”等号字符;


下面是一个私钥Key文件编码后的Base64文件: 具体内容按照管理员要求删除

可以用开源工具openssl解码PEM文件:openssl ec -in SE1.key.pem -text
#openssl ec -in SE1.key.pem -text
read EC key
Private-Key: (256 bit)
priv:
4e:a8:8c:46:51:00:7b:36:a6:4c:8c:4e:bb:9d:b1:
1f:64:91:27:d7:26:bf:e5:b9:bc:eb:39:54:9e:61:
a1:fa
pub:
04:ca:0b:7e:5a:fa:07:34:d1:84:4b:2a:eb:5a:0a:
09:2c:4a:71:68:9a:33:8d:12:d3:78:f1:9b:39:78:
5d:cc:c1:ba:58:69:67:71:4d:a7:a7:e7:3d:b3:99:
6b:72:a4:bf:cd:78:a5:0f:55:fc:64:73:cd:2f:a7:
7b:90:dc:d7:7f
ASN1 OID: SM2
writing EC key

其实也可以自己写python脚本来完成PEM文件的Base64的编码或解码:

import base64

下面从16进制的私钥keyDER编码后的码流去进行Base64编码生成PEM文本:

S = bytes().fromhex('308187020100301306072a8648ce3d020106082a811ccf5501822d046d306b02010104204ea88c4651007b36a64c8c4ebb9db11f649127d726bfe5b9bceb39549e61a1faa14403420004ca0b7e5afa0734d1844b2aeb5a0a092c4a71689a338d12d378f19b39785dccc1BA586967714DA7A7E73DB3996B72A4BFCD78A50F55FC6473CD2FA77B90DCD77F')
e64 = base64.b64encode(S)
print(e64)

下面从PEM文本进行Base64解码,生成16进制的私钥keyDER编码后的码流:

e64 = b'MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgTqiMRlEAezamTIxOu52xH2SRJ9cmv+W5vOs5VJ5hofqhRANCAATKC35a+gc00YRLKutaCgksSnFomjONEtN48Zs5eF3MwbpYaWdxTaen5z2zmWtypL/NeKUPVfxkc80vp3uQ3Nd/'
d64 = base64.b64decode(e64)
print(d64.hex())

Base64文件解码后,可以读出私钥和公钥内容,下面是Base64解码后的16进制码流,对应ASN.1 DER 编码/解码说明::
308187 (30 代表sequence,81:8代表内容长度超过了127,1代表后面有一个字节描述长度,87代表sequence内容的长度)
020100 (02整型;01;长度;取值是00)
3013  (30 代表sequence,13:代表长度是19字节)
0607   (06代表object id,07代表长度)
2a8648ce3d0201 (1.2.840.10045.2.1 ecPublicKey (ANSI X9.62 public key type))
0608    (06代表object id,07代表长度)
2a811ccf5501822d  DER编码的OID:1.2.156.10197.1.301(1.2.156.10197.1.301 sm2ECC (China GM Standards Committee))

046d (04代表OCTET STRING,6d是长度109)
306b (30代表sequence,6b代表长度107)
020101 (02代表整数,01代表长度1,取值是01 ecPrivkeyVer1)
0420 (04代表OCTET STRING,20是长度32)
4ea88c4651007b36a64c8c4ebb9db11f649127d726bfe5b9bceb39549e61a1fa (32字节私钥)
a1 44  (a Context-specific+constucted 1代表 publicKey  [1] 里面的数字tag [1];44代表长度68)
0342  03代表bitstring,42代表长度66
00 padding
04 (04代表是未压缩的公钥,The first octet of the OCTET STRING indicates whether the key is compressed or uncompressed.  The uncompressed form is indicated
by 0x04 and the compressed form is indicated by either 0x02 or 0x03 (see 2.3.3 in [SEC1]).)
ca0b7e5afa0734d1844b2aeb5a0a092c4a71689a338d12d378f19b39785dccc1BA586967714DA7A7E73DB3996B72A4BFCD78A50F55FC6473CD2FA77B90DCD77F(64字节公钥X+Y,各32字节)

下面是私钥key文件的ASN.1格式描述:
PrivateKeyInfo ::= SEQUENCE {
version                   Version,
privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
privateKey                PrivateKey,
attributes           [0]  IMPLICIT Attributes OPTIONAL }

Version ::= INTEGER

PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier

PrivateKey ::= OCTET STRING

Attributes ::= SET OF Attribute

私钥内容的具体解释取决与算法:
privateKey is an octet string whose contents are the value of the
private key. The interpretation of the contents is defined in the
registration of the private-key algorithm. For an RSA private
key, for example, the contents are a BER encoding of a value of
type RSAPrivateKey.

ECPrivateKey ::= SEQUENCE {
version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey     OCTET STRING,
parameters [0] ECParameters { { NamedCurve }} OPTIONAL,
publicKey  [1] BIT STRING OPTIONAL
}

The parameter for id-ecPublicKey is as follows and MUST always be
present:

ECParameters ::= CHOICE {
namedCurve         OBJECT IDENTIFIER
-- implicitCurve   NULL
-- specifiedCurve  SpecifiedECDomain
}
-- implicitCurve and specifiedCurve MUST NOT be used in PKIX.
-- Details for SpecifiedECDomain can be found in [X9.62].
-- Any future additions to this CHOICE should be coordinated
-- with ANSI X9.


ALGORITHM ::= CLASS {
&Type OPTIONAL,
&id OBJECT IDENTIFIER UNIQUE }
WITH SYNTAX {
[PARMS &Type]
IDENTIFIED BY &id }

AlgorithmIdentifier{ALGORITHM:SupportedAlgorithms} ::= SEQUENCE {
algorithm ALGORITHM.&id({SupportedAlgorithms}),
parameters ALGORITHM.&Type({SupportedAlgorithms}{@algorithm}) OPTIONAL,
... }

本文导航1 前言2 PEM DER 转换2.1 PEM DER 格式 2.2 DER PEM 格式 3 DER 解码3.1 初步解码3.2 DER 文件 结构3.3 解码*关于BIT_STRING和modulus部分数据以0x00开头的说明*Ref 最近在玩CTF,还没入门,做题的时候遇到一道RSA的题,给了一个pub key . pem 文件 和一个flag.enc 文件 。之前对于rsa的认识停留在ssh的时候生成公钥和 私钥 文件 ,但是 文件 里面具体内容没有关注过,所以打开pub key . pem 文件 后不知道怎么处理。 看了网上都
文件 是指由创建者所定义的、具有 文件 名的一组相关元素的集合,可分为有结构 文件 和无结构 文件 两种。在有结构的 文件 中, 文件 由若干个相关记录组成;而无结构 文件 则被看成是一个字符流。分类 文件 即用户或系统根据 文件 的类型或 文件 用途对 文件 进行分类。分类 文件 的标准有很多,一般取决于实际应用需求。分类 文件 主要是为了方便对 文件 进行管理。---- 百度百科 2. 文件 类型 //编程中常用文... DER 格式 :二机制 格式 而CRT, CER, KEY 这几种证书和密钥 文件 ,它们都有自己的schema,在存储为物理 文件 时,既可以是 PEM 格式 ,也可以 DER 格式 。 CER:一般用于windows的证书 文件 格式 CRT:一般用于Linux的证书,包含公钥和主体信息 KEY :一般用于密钥,特别是 私钥 打个比方:CE 国密 算法是我国自主研发的一种密码算法体系,具有高安全性和高效性的特点。它包括了很多种算法,其中包括了SM2、SM3和SM4等算法。 要对txt 文件 进行加密,可以使用SM4算法。SM4算法是一种分组密码算法,对明文 文件 进行分组,并通过密钥进行加密操作。加密过程中,每个分组都会经过一系列的轮函数运算,最终得到密文。 具体来说,加密txt 文件 的步骤如下: 1. 选择一个128位的密钥,这个密钥是加密和解密的关键。密钥的选择应当保证安全性。 2. 将txt 文件 分组,每个分组为128位。如果 文件 长度不是128位的整数倍,则需要填充数据。 3. 对每个分组进行加密操作。加密过程中,分组会经过多轮的轮函数运算,运算包括置换和代换操作。 4. 对最后一个分组进行填充操作,填充数据是根据 文件 长度计算得出的。 5. 最终得到加密后的密文 文件 。 解密txt 文件 的步骤与加密相反: 1. 使用相同的密钥,将密文 文件 分组。 2. 对每个分组进行解密操作。 3. 去除填充数据,得到解密后的明文 文件 。 需要注意的是, 国密 算法的安全性非常高,但是也需要使用者保证密钥的安全。密钥泄露可能会导致 文件 被恶意攻击者解密,因此在使用 国密 算法加解密 文件 时,密钥的管理和保护至关重要。 ### 回答2: 国密 算法是指由中国自主研发的密码算法,用于数据的加密和解密。在使用 国密 算法对txt 文件 进行加解密时,首先需要选择适当的 国密 算法,如SM1、SM2、SM3、SM4等。 对于加密操作,首先需要将明文txt 文件 转化为二进制 格式 ,然后利用选定的 国密 算法对其进行加密。加密过程中,需要提供 国密 算法所需的密钥和初始化向量。密钥可通过密钥管理系统生成并保存,然后通过合适的加密方式将其加载到加密程序中。初始化向量可通过随机产生的方式,确保不同的加密操作具有不同的初始化向量,以增加加密算法的安全性。 对于解密操作,首先需要利用相同的 国密 算法,提供正确的密钥和初始化向量。然后,对加密的二进制 文件 进行解密操作,得到解密后的二进制数据。最后,将解密的二进制数据转化为明文txt 文件 格式 ,即可得到原始的明文 文件 。 使用 国密 算法加解密txt 文件 能够实现对 文件 的保密性和完整性的保护。通过合理的密钥管理和初始化向量的使用,可以增加算法的安全性。 国密 算法已经在中国的多个领域中得到广泛应用,具有一定的安全性和实用性。 dtype character code description int8 i1 8-bit signed integer int16 i2 16-bit signed integer int32 i4 32-bit signed integer int64 i8 64-bit signed integer uint8 u1 8-bit unsigned integer uint16 u2 16-bit unsigned integer uint32 u4 32-bit unsigned integer uint64 u8 64-bit unsigned integer float16 f2 16-bit floating-point number float32 f4 32-bit floating-point number float64 f8 64-bit floating-point number float128 f16 128-bit floating-point number complex64 c8 64-bit complex floating-point number complex128 c16 128-bit complex floating-point number complex256 c32 256-bit complex floating-point number bool ? Boolean (True or False) unicode U Unicode string object O Python objects 国密(3)- 预主密钥/主密钥计算和Finished消息的加解密 jlzygs: 此文对应的wireshark报文可以提供一份对比学习一下吗 一文搞懂X509证书PEM DER CRT CER的区别 Simple-Easy 化繁为简: DER文件其实是二进制文件,可以找一个der文件,拿ultraedit等工具用二进制bin模式查看下。 一文搞懂X509证书PEM DER CRT CER的区别 airdragon2021: 3082 07fd 3082 05e5 a003 0201 0202 1068 1604 dff3 34f1 71d8 0a73 5599 c141 7230 ----你这一串数字哪来的?从哪里生成的,没看到der有这些 X509证书详解 恋喵大鲤鱼: 感谢回复,我已经找打答案了,参见 https://security.stackexchange.com/questions/114746/why-is-the-signature-algorithm-listed-twice-in-an-x509-certificate