openssl加密解密

openssl加密解密

常用加密方式

  1. 对称加密:发送方和接受方使用同样的一把私钥,私钥用于加密和解密
  2. 非对称加密:有一把公钥,有一把私钥,使用公钥加密,只能使用私钥进行解密

但非对称加密比对称加密慢,有时会慢一两个数量级,所以常用方式是:

使用使用对称加密对非对称加密的公私钥进行加密

1. 什么是OpenSSL

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

2. 基本功能

openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。

为了做个更简单的区分,我分成下面3种,可能你看着会亲切一些

  • 加解密库(本章只讨论加解密)
  • SSL协议实现
  • 一些经过封装,方便你使用加解密和SSL的工具

密钥、证书的编码格式和后缀名

目前有以下两种编码格式.

  • PEM - Privacy Enhanced Mail
    打开看文本格式,以"-----BEGIN-----"开头, "-----END-----"结尾,内容是Base64编码,查看PEM格式的信息可以用命令
    openssl rsa -in my.pem -text -noout
    Unix服务器偏向于使用这种编码格式.
  • DER - Distinguished Encoding Rules
    打开看是二进制格式,不可读,查看DER格式的信息可以用命令
    openssl rsa -in my.der -inform der -text -noout
    Java和Windows服务器偏向于使用这种编码格式.

我们平时见到的多种后缀名,都是语义化的后缀,在生成密钥的时候,比如我们私钥的后缀名可以写.pem .key,都是可以的,以下几种为常用后缀

  • CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于Unix系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.
  • CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.
  • KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
    查看KEY的办法:
    openssl rsa -in mykey.key -text -noout
    如果是DER格式的话,同理应该这样了:
    openssl rsa -in mykey.key -text -noout -inform der
  • CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好,查看的办法:
    openssl req -noout -text -in my.csr
    (如果是DER格式的话照旧加上-inform der,这里不写了)

3. 常用加解密算法使用

我们重点讨论如何使用

1.对称加密

我们需要用到 openssl enc 命令,先看下帮助文档

$ openssl enc -h 

:<<!
-in <file>     输入文件
-out <file>    输出文件
-pass <arg>    密码
-S             盐,用于加盐加密,请避免人为输入,下面讨论
-e             encrypt 加密操作
-d             decrypt 解密操作
-a/-base64     base64 encode/decode, depending on encryption flag  是否将结果base64编码
-k             已被-pass参数取代
-kfile         已被-pass参数取代
-md            指定密钥生成的摘要算法 默认MD5
-K/-iv         加密所需的key和iv向量,由输入的-pass生成
-[pP]          print the iv/key (then exit if -P)  是否需要在控制台输出生成的 key和iv向量
-bufsize <n>   读写文件的I/O缓存,一般不需要指定
-engine e      指定三方加密设备,没有环境,暂不实验

Cipher Types  以下是部分算法,我们可以选择用哪种算法加密
-aes-128-cbc               -aes-128-cbc-hmac-sha1     -aes-128-cfb              
-aes-128-cfb1              -aes-128-cfb8              -aes-128-ctr              
-aes-128-ecb               -aes-128-gcm               -aes-128-ofb      
…………
!

使用,默认从控制台输入密码,如果不指定加密算法,是不会进行加密的,也不会报错,比如我们不指定算法,只指定base64格式输出,就相当于只做了base64编码而已

/*对文件进行base64编码*/
openssl enc -base64 -in plain.txt -out base64.txt
/*对base64格式文件进行解密*/
openssl enc -base64 -d -in base64.txt -out plain2.txt
/*使用diff命令查看可知解码前后明文一样*/
diff plain.txt plain2.txt

实验

分别在使用和不使用密码加密文档的情况下,对文档进行加密

使用密码解密非加密文档

不使用密码解密加密文档

[sure@localhost 文档]$ openssl enc -base64 -in hello.c -out basehello.c -pass file:password.txt 
[sure@localhost 文档]$ openssl enc -base64 -in hello.c -out basehello2.c

[sure@localhost 文档]$ openssl enc -base64 -d -in basehello.c -out hello2.c -pass file:password.txt 
[sure@localhost 文档]$ openssl enc -base64 -d -in basehello2.c -out hello3.c -pass file:password.txt 
[sure@localhost 文档]$ openssl enc -base64 -d -in basehello.c -out hello4.c
[sure@localhost 文档]$ cat hello*
#include <stdio.h>
int main(){
   
	char h = 'h';
	char e = 'e';
	char l = 'l';
	char o = 'o';
	printf("%c%c%c%c%c,", h, e, l, l, o);
	return 0;
}
#include <stdio.h>
int main(){
   
	char h = 'h';
	char e = 'e';
	char l = 'l';
	char o = 'o';
	printf("%c%c%c%c%c,", h, e, l, l, o);
	return 0;
}
#include <stdio.h>
int main(){
   
	char h = 'h';
	char e = 'e';
	char l = 'l';
	char o = 'o';
	printf("%c%c%c%c%c,", h, e, l, l, o);
	return 0;
}
#include <stdio.h>
int main(){
   
	char h = 'h';
	char e = 'e';
	char l = 'l';
	char o = 'o';
	printf("%c%c%c%c%c,", h, e, l, l, o);
	return 0;
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值