Openssl-加密-解密

openssl encrypt and decrypt

Posted by Randle on September 1, 2018

生成公钥私钥

使用命令生成私钥:

1
openssl genrsa -out rsa_private_key.pem 1024

参数:

  • genrsa 生成密钥
  • -out 输出到文件 rsa_private_key.pem 文件名
  • 1024 长度(bit)

从私钥中提取公钥:

1
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

参数:

  • rsa 提取公钥
  • -in 从文件中读入 rsa_private_key.pem 文件名
  • -pubout 输出
  • -out 到文件 rsa_public_key.pem 文件名

公钥加密-私钥解密

新建一个readme.txt 内容是taoshihan

使用公钥加密:

1
openssl rsautl -encrypt -in readme.txt -inkey rsa_public_key.pem -pubin -out hello.en

参数:

  • rsautl 加解密
  • -encrypt 加密
  • -in 从文件输入
  • readme.txt 文件名
  • -inkey 输入的密钥
  • rsa_public_key.pem 上一步生成的公钥
  • -pubin 表名输入是公钥文件 (默认输入为私钥,所以后文签名时不指定此参数) * -out输出到文件
  • hello.en 输出文件名

使用私钥解密:

1
openssl rsautl -decrypt -in hello.en -inkey rsa_private_key.pem -out hello.de

参数:

  • -decrypt 解密
  • -in 从文件输入 * hello.en 上一步生成的加密文件
  • -inkey 输入的密钥 * rsa_private_key.pem 上一步生成的私钥
  • -out输出到文件
  • hello.de 输出的文件名

私钥签名-公钥验证

1
2
openssl rsautl -sign -in readme.txt -inkey rsa_private_key.pem -out hello.sign
openssl rsautl -verify -in hello.sign -inkey rsa_public_key.pem -pubin -out hello.verify

参数含义与上节公钥加密,私钥解密一致。

加密或签名结果用base64编码

加密或签名之后的字符,大部分为非可显示字符,一般通过base64编码后传输。

base64 编码

1
openssl rsautl -sign -in readme.txt -inkey rsa_private_key.pem | openssl base64

管道操作,把加密结果,送给base64编码

base64 解码

1
openssl base64 -d -in hello.sign | openssl rsautl -verify -inkey rsa_public_key.pem -pubin -out hello.verify
  • -d 参数代表解码
  • -in 输入文件(没有这个参数代表解码输入字符串),如下
1
echo YWJjCg== | openssl base64 -d

显示结果为:abc

函数api

对应上述版本的功能,都可以从openssl的库中找到对应的api接口调用。


引用

使用openssl实现RSA非对称加密 openssl-man1-rsautl 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

C API

Linux C/C++ Openssl RSA Encrypt/Decrypt(加密/解密) 简单示例教程