PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准,主要用来将各种对象保存成PEM格式,并将PEM格式的各种对象读取到相应的结构中。它的基本流程是这样的:
- 信息转换为ASCII码或其它编码方式;
- 使用对称算法加密转换了的邮件信息;
- 使用BASE64对加密后的邮件信息进行编码;
- 使用一些头定义对信息进行封装,这些头信息格式如下(不一定都需要,可选的):
Proc-Type,4:ENCRYPTED
DEK-Info: cipher-name, ivec其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRYPTED(信息已经加密和签名)、MIC-ONLY(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、也没有进行编码,可使用非PEM格式阅读)以及CLEAR(信息没有签名和加密并且没有进行编码,该项好象是openssl自身的扩展,但是并没有真正实现);;第二个头信息标注了加密的算法以及使用的ivec参量,ivec其实在这儿提供的应该是一个随机产生的数据序列,与块加密算法中要使用到的初始化变量不一样。 。 - 在这些信息的前面加上如下形式头标注信息:
-----BEGIN PRIVACY-ENHANCED MESSAGE-----
在这些信息的后面加上如下形式尾标注信息:
-----END PRIVACY-ENHANCED MESSAGE-----
注意:openssl并没有实现PEM的全部标准,它只是对openssl中需要使用的一些选项做了实现,详细的PEM格式,请参考RFC1421-1424
openssl使用:
生成私钥(genrsa):
genrsa [args] [numbits]
[numbits]: 密钥位数,建议1024及以上
[args]:
-des 生成的密钥使用des方式进行加密
-des3 生成的密钥使用des3方式进行加密
-seed 生成的密钥还是要seed方式进行
-aes128, -aes192, -aes256
生成的密钥使用aes方式进行加密
-camellia128, -camellia192, –camellia256
生成的密钥使用camellia方式进行加密
-out [file] 生成的密钥文件,可从中提取公钥
-passout arg 指定密钥文件的加密口令,可从文件、环境变量、终端等输入
-f4 选择指数e的值为默认值为65537(0x10001)
-[num] 选择指数e的值,默认值为65537,使用该选项则指数指定为[num]
-engine e 指定三方加密库或者硬件
-rand file:[file]:
产生随机数的种子文件
openssl genrsa -out private_key.pem 1024
//生成一个长度为1024的pem私钥文件
管理密钥(rsa):
rsa [options] <infile >outfile
[options]:
-inform [arg] 输入文件格式,默认pem格式
-outform [arg] 输出文件格式,默认pem格式
-in [arg] 输入文件
-out [arg] 输出文件
-passin [arg] 指定输入文件的加密口令,可来自文件、终端、环境变量等
-passout [arg] 指定输出文件的加密口令,可来自文件、终端、环境变量等
-sgckey 指定SGC编码格式,兼容老版本,不应再使用
-des 使用des加密输出的文件
-des3 使用des3加密输出的文件
-seed 使用seed加密输出的文件
-aes128, -aes192, -aes256
使用aes加密输出的文件
-camellia128, -camellia192, -camellia256
使用camellia加密输出的文件呢
-text 以明文形式输出各个参数值
-noout 不输出密钥到任何文件
-modulus 输出模数指
-check 检查输入密钥的正确性和一致性
-pubin 指定输入文件是公钥
-pubout 指定输出文件是公钥
-engine e 指定三方加密库或者硬件
openssl rsa -text -noout -modulus -in private_key.pem
//查看pem文件,输出模数
openssl rsa -in private_key.pem -pubout -out public_key.pem
//用私钥输出公钥
加密解密(rsautl)
rsautl [options]
[options]:
-in [file] 输入文件
-out [file] 输出文件
-inkey [file] 输入的密钥
-keyform [arg] 指定密钥格式
-pubin 指定输入的是RSA公钥
-certin 指定输入的是证书文件
-ssl 使用SSLv23的填充方式
-raw 不进行填充
-pkcs 使用V1.5的填充方式
-oaep 使用OAEP的填充方式
-sign 使用私钥做签名
-verify 使用公钥认证签名
-encrypt 使用公钥加密
-decrypt 使用私钥解密
-hexdump 以16进制dump输出
-engine e 指定三方库或者硬件设备
-passin [arg] 指定输入的密码
openssl rsautl -encrypt -inkey public_key.pem -pubin -in data.txt -out back.txt
//用public_key.pem公钥文件对data.txt文件进行加密输出back.txt文件
openssl rsautl -decrypt -inkey private_key.pem -in back.txt -out data.txt
//用private_key.pem私钥文件对back.txt文件进行解密输出data.txt文件