1、对称加密算法概述

openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用。

openssl的对称加密算法指令主要用来对数据进行加密和解密处理,openssl基本上为所有其支持的对称加密算法都提供了指令的方式的应用,这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或者其他属性组合而成。例如DES算法的CBC模式,其对应的指令就是des-cbc。可以通过命令查看当前版本的openssl支持的对称加密算法,例如Ubunt14.04 openssl版本及支持对称加密算法指令如下:

  1. xlzh@cmos:~$ openssl enc -help
  2. unknown option '-'
  3. options are
  4. ...
    /**/
  5. Cipher Types
  6. -aes--cbc -aes--cbc-hmac-sha1 -aes--cfb
  7. -aes--cfb1 -aes--cfb8 -aes--ctr
  8. -aes--ecb -aes--gcm -aes--ofb
  9. -aes--xts -aes--cbc -aes--cfb
  10. -aes--cfb1 -aes--cfb8 -aes--ctr
  11. -aes--ecb -aes--gcm -aes--ofb
  12. -aes--cbc -aes--cbc-hmac-sha1 -aes--cfb
  13. -aes--cfb1 -aes--cfb8 -aes--ctr
  14. -aes--ecb -aes--gcm -aes--ofb
  15. -aes--xts -aes128 -aes192
  16. -aes256 -bf -bf-cbc
  17. -bf-cfb -bf-ecb -bf-ofb
  18. -blowfish -camellia--cbc -camellia--cfb
  19. -camellia--cfb1 -camellia--cfb8 -camellia--ecb
  20. -camellia--ofb -camellia--cbc -camellia--cfb
  21. -camellia--cfb1 -camellia--cfb8 -camellia--ecb
  22. -camellia--ofb -camellia--cbc -camellia--cfb
  23. -camellia--cfb1 -camellia--cfb8 -camellia--ecb
  24. -camellia--ofb -camellia128 -camellia192
  25. -camellia256 -cast -cast-cbc
  26. -cast5-cbc -cast5-cfb -cast5-ecb
  27. -cast5-ofb -des -des-cbc
  28. -des-cfb -des-cfb1 -des-cfb8
  29. -des-ecb -des-ede -des-ede-cbc
  30. -des-ede-cfb -des-ede-ofb -des-ede3
  31. -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1
  32. -des-ede3-cfb8 -des-ede3-ofb -des-ofb
  33. -des3 -desx -desx-cbc
  34. -id-aes128-GCM -id-aes192-GCM -id-aes256-GCM
  35. -rc2 -rc2--cbc -rc2--cbc
  36. -rc2-cbc -rc2-cfb -rc2-ecb
  37. -rc2-ofb -rc4 -rc4-
  38. -rc4-hmac-md5 -seed -seed-cbc
  39. -seed-cfb -seed-ecb -seed-ofb

可以看到上述我们执行的是enc -help命令,enc是什么东西?原来openssl提供了两种方式调用对称加密算法:

一种就是直接调用对称加密指令,例如:

  1. openssl des-cbc -in plain.txt -out encrypt.txt -pass pass:

另外一种是使用enc的方式,即用对称加密指令作为enc指令的参数,例如:.

  1. openssl enc -des-cbc -in plain.txt -out encrypt.txt -pass pass:

上述两条指令完成的功能是一样的,而且其参数也是一样。原来enc是作用是什么呢?简单来说,为了省事……。

openssl提供了N多的对称加密算法指令,enc就是把这些N多的对称的加密算法指令统一集成到enc指令中。当用户使用时,只需使用enc,指定加密算法,就是完成单独的加密算法指令完成的操作。而且,enc中可以指定的对称加密算法指令可能并没有以单独指令的形式存在。所有笔者建议使用enc这种方式。

当然,虽然openssl为我们提供的对称加密算法指令虽然功能强大,但并不完整,例如对称加密算法不支持76位的RC2加解密或者84位的RC4加解密灯功能。如果想灵活的使用这些加密算法和模式,就需要学习openssl提供的API

2、对称加密算法指令参数

可以通过enc的man手册查看enc的详细用法,也可以通过enc -help的方式查看主要参数概要说明,如下

  1. xlzh@cmos:~$ openssl enc -help
  2. unknown option '-help'
  3. options are
  4. -in <file> input file
  5. -out <file> output file
  6. -pass <arg> pass phrase source
  7. -e encrypt
  8. -d decrypt
  9. -a/-base64 base64 encode/decode, depending on encryption flag
  10. -k passphrase is the next argument
  11. -kfile passphrase is the first line of the file argument
  12. -md the next argument is the md to use to create a key
  13. from a passphrase. One of md2, md5, sha or sha1
  14. -S salt in hex is the next argument
  15. -K/-iv key/iv in hex is the next argument
  16. -[pP] print the iv/key (then exit if -P)
  17. -bufsize <n> buffer size
  18. -nopad disable standard block padding
  19. -engine e use engine e, possibly a hardware device.
  20. Cipher Types
  21. ...

[in/out]

这两个参数指定输入文件和输出文件,加密是输入文件是明文,输出文件是密文;解密时输入文件是密文,输出文件是明文。

[pass]

指定密码的输入方式,共有五种方式:命令行输入(stdin)、文件输入(file)、环境变量输入(var)、文件描述符输入(fd)、标准输入(stdin)。默认是标准输入,及从键盘输入。

[e/d]

e:加密, d:解密  默认是加密

[-a/-base64]

由于文件加密后是二进制形式,不方便查看,使用该参数可以使加密后的内容经过base64编码,使其可读;同样,解密时需要先进行base64解编码,然后进行解密操作。

[-k/-kfile]

兼容以前版本,指定密码输入方式,现已被pass参数取代

[md]

指定密钥生成的摘要算法,用户输入的口令不能直接作为文件加密的密钥,而是经过摘要算法做转换,此参数指定摘要算法,默认md5

[-S]

为了增强安全性,在把用户密码转换成加密密钥的时候需要使用盐值,默认盐值随机生成。使用该参数,则盐值由用户指定。也可指用-nosalt指定不使用盐值,但降低了安全性,不推荐使用。

[K/IV]

默认文件的加密密钥的Key和IV值是有用户输入的密码经过转化生成的,但也可以由用户自己指定Key/IV值,此时pass参数不起作用

[pP]

加上p参数会打印文件密钥Key和IV值,加上P参数也会打印文件密钥Key和IV值,但不进行真正的加解密操作

[bufsize]

读写文件的I/O缓存,一般不需要指定

[-nopad]

不使用补齐,这就需要输入的数据长度是使用加密算法的分组大小的倍数

[engine]

指定三方加密设备,没有环境,暂不实验

3、对称加密算法使用示例

1、只对文件进行base64编码,而不使用加解密

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

2、不同方式的密码输入方式

  1. /*命令行输入,密码123456*/
  2. openssl enc -aes--cbc -in plain.txt -out out.txt -pass pass:
  3. /*文件输入,密码123456*/
  4. echo > passwd.txt
  5. openssl enc -aes--cbc -in plain.txt -out out.txt -pass file:passwd.txt
  6. /*环境变量输入,密码123456*/
    passwd=123456
    export passwd
    openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
    /*从文件描述输入*/
    openssl enc -aes--cbc -in plain.txt -out out.txt -pass fd:
    /*从标准输入输入*/
    openssl enc -aes--cbc -in plain.txt -out out.txt -pass stdin

3、固定salt值加密

  1. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -pass pass: -P
  2. salt=32F5C360F21FC12D
  3. key=D7E1499A578490DF940D99CAE2E29EB1
  4. iv =78EEB538897CAF045F807A97F3CFF498
  5. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -pass pass: -P
  6. salt=DAA482697BECAB46
  7. key=9FF8A41E4AC011FA84032F14B5B88BAE
  8. iv =202E38A43573F752CCD294EB8A0583E7
  9. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -pass pass: -P -S
  10. salt=
  11. key=50E1723DC328D98F133E321FC2908B78
  12. iv =1528E9AD498FF118AB7ECB3025AD0DC6
  13. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -pass pass: -P -S
  14. salt=
  15. key=50E1723DC328D98F133E321FC2908B78
  16. iv =1528E9AD498FF118AB7ECB3025AD0DC6
  17. xlzh@cmos:~$

可以看到,不使用-S参数,salt参数随机生成,key和iv值也不断变化,当slat值固定时,key和iv值也是固定的。

4、加解密后过程使用base64编解码

  1. /*使用-a参数加密后使用base64编码*/
  2. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -a -out encrypt.txt -pass pass:
  3. /*使用-a参数解密前使用base64解码*/
  4. xlzh@cmos:~$ openssl enc -aes--cbc -in encrypt.txt -d -a -out plain1.txt -pass pass:
  5. /*文件一样*/
  6. xlzh@cmos:~$ diff plain.txt plain1.txt
  7. /*加密后文件使用了base64编码*/
  8. xlzh@cmos:~$ cat encrypt.txt
  9. U2FsdGVkX19KbCj9GMI1TBOQjP8JJcefIUH1tHwf/Z4=

5、手动指定Key和IV值

  1. /*手动指定key和iv值,salt固定*/
  2. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -K -iv f123 -p
  3. salt=0B00000000000000
  4. key=
  5. iv =F1230000000000000000000000000000
  6. /*指定pass密码,不起作用,注意Key和IV值是16进制*/
  7. xlzh@cmos:~$ openssl enc -aes--cbc -in plain.txt -out encrypt.txt -K -iv f123 -p -pass pass:
  8. salt=F502F4B8DE62E0E5
  9. key=
  10. iv =F1230000000000000000000000000000

openssl 对称加密算法enc命令详解的更多相关文章

  1. openssl 非对称加密算法RSA命令详解

    1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...

  2. openssl 非对称加密算法DSA命令详解

    1.DSA算法概述 DSA算法是美国的国家标准数字签名算法,它只能用户数字签名,而不能用户数据加密和密钥交换. DSA与RSA的生成方式不同,RSA是使用openssl提供的指令一次性的生成密钥(包括 ...

  3. ssh scp命令详解

    --查看版本 $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 --用SSH登录到远程主机 localhost$ ssh -l jsmith(用户名 ...

  4. RMAN命令详解和常用汇总

    RMAN命令详解和常用汇总转摘汇集,日后使用本文链接:https://blog.csdn.net/EVISWANG/article/details/50448370http://blog.itpub. ...

  5. AES 加密算法的原理详解

    AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...

  6. Git的使用以及常用命令(详解)

    一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. linux yum命令详解

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  9. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

随机推荐

  1. discuzx3.2伪静态

    首先,我们要新建一个名为.htaccess的文件,文件名为空白,这点很重要.很多人无法新建这个文件,在这里教大家如何新建没有名字的文件. 新建一个TXT文本,名字先默认.然后打开这个文本,然后把我们的 ...

  2. Oracle游标cursor2显示的游标等

    --在一中我们介绍了实现过程 select *from stud; declare cursor mycur is select id,name from stud;--1声明 v_id intege ...

  3. C#远程获取/读取网页内容

    转载自 :http://blog.csdn.net/gisfarmer/article/details/2836904 using System; using System.Collections.G ...

  4. nginx配置时的一些问题

    在配置nginx的时候出现的一些问题,在此记录: 1.如何打开nginx服务: 方法1:打开解压的下载文件,双击打开nginx.exe即可(出现闪退,我以为是出问题了,其实是服务已经启动了) 方法2: ...

  5. ​C语言数组作为函数参数

    数组可以作为函数的参数使用,进行数据传送. 数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用:另一种是把数组名作为函数的形参和实参使用. 数组元素作函数实参 数组元素就是下标变量, ...

  6. jQuery延迟加载(懒加载)插件 – jquery.lazyload.js-Web前端(W3Cways.com) - Web前端学习之路

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  7. R语言的数据结构

    首先声明,R语言对大小写敏感. 一.向量 vector类型可以存储数字.字符和逻辑类型.构建函数为C(): > a <- c(1,2,3,4) > b <- c('dau',' ...

  8. java形参是否会改变实参

    之前一直对java这方面感到困惑---传入的形参是否会影响实参.因为c++有指针,而java没有,所以我做一个测试验证形参是否会影响实参.* 首先第一种情况---基本类型 哈哈,其实结果大概和我想的一 ...

  9. UITableView属性和方法

    1.初始化一个UITableView - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style struct CGRect { C ...

  10. Google谷歌推出goo.gl缩短网址服务 - Blog透视镜

    Blog部落格文章的网址,例如本篇文章:http://blog.openyu.org/2014/01/google-goo.gl.html,通常都很冗长,分享到社群网站上,容易使得讯息内容过多,同时也 ...