openssl基础(一)命令行工具

  openssl是实现Transport Layer Security (TLS)和Secure Sockets Layer (SSL) 协议的工具库,同时也是提供了通用密码算法,如对称密码,非对称密码,数字签名,消息摘要等等的密码库。openssl可以直接以命令行的方式使用,或者作为动态链接库在其他程序中使用。这篇博客先介绍命令行的使用方式。

查看可用命令

openssl list <option>

option设置为-help可以查看所有合法的option

january@vostro3470:~$ openssl list -help
Usage: list [options]
Valid options are:
 -help                   Display this summary
 -1                      List in one column
 -commands               List of standard commands
 -digest-commands        List of message digest commands
 -digest-algorithms      List of message digest algorithms
 -cipher-commands        List of cipher commands
 -cipher-algorithms      List of cipher algorithms
 -public-key-algorithms  List of public key algorithms
 -public-key-methods     List of public key methods
 -disabled               List of disabled features
 -missing-help           List missing detailed help strings
 -options val            List options for specified command

测试命令是否可用

openssl no-<command>

如果command存在,则返回1,并打印<command>;如果command不存在则返回0,并打印no-<command>

january@vostro3470:~$ openssl no-list
list
# 使用$?读取命令返回值
january@vostro3470:~$ echo $?
1
january@vostro3470:~$ openssl no-ffff
no-ffff
january@vostro3470:~$ echo $?
0
january@vostro3470:~$ 

口令生成秘钥

口令生成秘钥,或者是主密钥生成子秘钥要通过Key Derivation Function(KDF)来实现。KDF的主要实现算法分别是pbkdf2、bcrypt、scrypt,目前openssl推荐使用pbkdf2。因此在使用口令加密时,需要加上选项-pbkdf2来使用pbkdf2算法生成秘钥,另外还可以使用选项-iter <interation times>指定迭代次数。秘钥生成算法和迭代次数需要在解密的时候使用,否则无法正确解密。

短块填充模式

对于分组加密算法,当需要加密的内容不足一个块时,一种解决方案就是将其填充到一个块大小,openssl采用pkcs7的填充方式。该方法流程如下:

  1. 计算短块相比正常块缺少字符,把该值记为c
  2. 给短块填充c个字节,每个字节的内容为c的值

如果没有短块的话,就增加一整个块,块中每个字节的内容为块大小。该方法的支持不同长度的块,最大为255字节,即一个字节能表示的最大的数。

pkcs5的填充和pkcs7的填充唯一的区别是pkcs5固定了块大小为8字节,而pkcs7可以支持不同大小的块

pkcs即Public Key Cryptography Standards,是一些密码算法的标准文件,想了解的话参考维基百科PKCS

对称加密

使用aes-128-cbc进行PBE(password-based encryption)模式的加密,其中的-pbkdf2-iter 100就是指定口令生成秘钥算法(key derivation)的。

january@vostro3470:~/Desktop/code_protection$ openssl aes-128-cbc -pbkdf2 -iter 100 -e -in key_file -out key_file.aes
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:

january@vostro3470:~/Desktop/code_protection$ echo `cat key_file`
lQodMJXiCRSJYS3S7P36kr1Mp8YfY58V9DoKxVfCUVM=

january@vostro3470:~/Desktop/code_protection$ echo `cat key_file.aes`
Salted__����کk����o�����iH����.P��� ���u���jl��q��!y��IL��

january@vostro3470:~/Desktop/code_protection$ openssl aes-128-cbc -pbkdf2 -iter 100 -d -in key_file.aes -out key_file.aes.decrypt 
enter aes-128-cbc decryption password:

january@vostro3470:~/Desktop/code_protection$ cat key_file.aes.decrypt 
lQodMJXiCRSJYS3S7P36kr1Mp8YfY58V9DoKxVfCUVM=

非对称加密

RSA

秘钥生成

生成私钥

使用genrsa命令来生成私钥

openssl genrsa [options] <key length>

使用-out <key_file>将生成的秘钥保存到<key_file>文件

january@vostro3470:~/Desktop/code_protection$ openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
........................+++++
...............................+++++
e is 65537 (0x010001)

january@vostro3470:~/Desktop/code_protection$ cat private.pem 
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDY3Tcd96m79dJOkqdADPm88stNaBwYbS6DjvKneRIAsmoRYSVc
wXVkI7vPeyMysY5HPLxIuvUAAja4cptyGV2LPM2x34qIIihvGJS7DRChrst7g47K
PzOJIFByeuhP/9CJug5ZU25Te6mXGjvyHylpzns9af05iRBYRLFHGTUMVwIDAQAB
AoGABZopW1fThayDA06cjXYIWY44HEbNOwBPDEz8DcF96pCxVsOYsH2655xYtLJs
pVma4FI8VvCldZuZCEjFpTvsg6kejwtd6Rtpki26ssXxjtwvt+j4PNnfEu4Etixs
cx/JPJiFrWxpRop3ZVOpNpBUaZHERkL4QtT+nobWqeW3LFECQQD1H7+n6dB3lSVv
psNZYvoEzKrsMvSbj9ckptmMcKn2Rf6/XDhnY2bBQMcx3695JWjdk7OyHXkafawq
3gkLwiNPAkEA4nx5tqbYbiPBhlIk99MIoPyINVoMDwKvjLpaT0yfMnb6m/8aaBTC
uwYaS3kbjdNUOywu9G446Igo7ozRbQDkeQJADuW6ESttpwbiepGpB7KzPT1vGeHS
6e1pBuo5CIcEXVpNrDWfm/D3msEkGgzdLkCuyeCjKC0QYiLHJufNpvBKkwJBAK50
dQhlUhbcgefmBEXEj0P54S0/VESHrBM5Q/ELMyEbFoTspjl/rFOFKuHxwnCnVJ1T
tkNfV4R9xRGi9HoDEvkCQQDX7krJLyLWnTVkgyT/Nif4XhDovLHAO+ORdIGF8l0H
5esbi6DMv89iO8oqA6gQO2qxK5/yBw2ZCaEvquwjh5YH
-----END RSA PRIVATE KEY-----

生成公钥

使用rsa命令来生成公钥

openssl rsa -in <key_file> -pubout -out <pub_key>

使用-in <file>选项指定输入文件,-pubout表示输出公钥,-out <file>指定输出文件

january@vostro3470:~/Desktop/code_protection$ openssl rsa -in private.pem -pubout -out public.pem
writing RSA key

january@vostro3470:~/Desktop/code_protection$ cat public.pem 
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDY3Tcd96m79dJOkqdADPm88stN
aBwYbS6DjvKneRIAsmoRYSVcwXVkI7vPeyMysY5HPLxIuvUAAja4cptyGV2LPM2x
34qIIihvGJS7DRChrst7g47KPzOJIFByeuhP/9CJug5ZU25Te6mXGjvyHylpzns9
af05iRBYRLFHGTUMVwIDAQAB
-----END PUBLIC KEY-----


加密

使用rsautl命令来加密

 openssl rsautl -encrypt -pubin -in <file> -inkey <key_file> -out <file>

-encrypt表示加密,-publin表示输入的秘钥文件为公钥,-inkey <key_file>指定用于加密的公钥文件
-in <file>-out <file>指定加密操作的输入输出文件

january@vostro3470:~/Desktop/code_protection$ openssl rsautl -encrypt -pubin -in key_file -inkey public.pem -out key_file.rsa

january@vostro3470:~/Desktop/code_protection$ xxd key_file
00000000: 6c51 6f64 4d4a 5869 4352 534a 5953 3353  lQodMJXiCRSJYS3S
00000010: 3750 3336 6b72 314d 7038 5966 5935 3856  7P36kr1Mp8YfY58V
00000020: 3944 6f4b 7856 6643 5556 4d3d            9DoKxVfCUVM=

january@vostro3470:~/Desktop/code_protection$ xxd key_file.rsa 
00000000: 7639 01e3 3854 2b7d 6c43 c009 a75f 10c2  v9..8T+}lC..._..
00000010: a0c5 bb94 1828 1338 77a3 3e00 07a4 d429  .....(.8w.>....)
00000020: f46c 833d 8191 aaeb c974 e2e2 7214 887b  .l.=.....t..r..{
00000030: aea9 cfc7 7002 4d12 5d1b 6e52 4bb7 df50  ....p.M.].nRK..P
00000040: f10e 57a5 2783 5afe 2fa0 90b7 af99 4db8  ..W.'.Z./.....M.
00000050: 729c 2a94 0098 9806 f975 0251 9626 abe7  r.*......u.Q.&..
00000060: 05d4 83f0 ce63 6f5a 36aa dce8 0dd0 1a93  .....coZ6.......
00000070: 4a0d 7144 5f2b 259f e9d7 106b e048 dde1  J.qD_+%....k.H..

解密

使用rsautl命令解密

 openssl rsautl -decrypt -in <file> -inkey <key_file> -out <file>

-decrypt表示解密,-inkey <key_file>指定用于解密的私钥文件,其他和加密类似

 january@vostro3470:~/Desktop/code_protection$ openssl rsautl -decrypt -inkey private.pem -in key_file.rsa -out key_file.rsa.decrypt

january@vostro3470:~/Desktop/code_protection$ xxd key_file.rsa.decrypt 
00000000: 6c51 6f64 4d4a 5869 4352 534a 5953 3353  lQodMJXiCRSJYS3S
00000010: 3750 3336 6b72 314d 7038 5966 5935 3856  7P36kr1Mp8YfY58V
00000020: 3944 6f4b 7856 6643 5556 4d3d            9DoKxVfCUVM=


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章