详细的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
文件
能够实现对
文件
的保密性和完整性的保护。通过合理的密钥管理和初始化向量的使用,可以增加算法的安全性。
国密
算法已经在中国的多个领域中得到广泛应用,具有一定的安全性和实用性。
国密(3)- 预主密钥/主密钥计算和Finished消息的加解密
jlzygs:
一文搞懂X509证书PEM DER CRT CER的区别
Simple-Easy 化繁为简:
一文搞懂X509证书PEM DER CRT CER的区别
airdragon2021:
X509证书详解
恋喵大鲤鱼: