openssl enc(对称加密)
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
对称加密工具。了解对称加密的原理后就很简单了,原理部分见下文。
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-k password] [-S salt] [-salt] [-md] [-p/-P]
选项说明:
-ciphername:指定对称加密算法(如des3),可独立于enc直接使用,如openssl des3或openssl enc -des3。推荐在enc后使用,这样不依赖于硬件
-in filename :输入文件,不指定时默认是stdin
-out filename:输出文件,不指定时默认是stdout
-e:对输入文件加密操作,不指定时默认就是该选项
-d:对输入文件解密操作,只有显示指定该选项才是解密
-pass:传递加、解密时的明文密码。若验证签名时实用的公钥或私钥文件是被加密过的,则需要传递密码来解密。密码的格式见"openssl 密码格式"
-k :已被"-pass"替代,现在还保留是为了兼容老版本的openssl
-base64:在加密后和解密前进行base64编码或解密,不指定时默认是二进制。注意,编码不是加解密的一部分,而是加解密前后对数据的格式"整理"
-a:等价于-base64
-salt:单向加密时使用salt复杂化单向加密的结果,此为默认选项,且使用随机salt值
-S salt:不使用随机salt值,而是自定义salt值,但只能是16进制范围内字符的组合,即"0-9a-fA-F"的任意一个或多个组合
-p:打印加解密时salt值、key值和IV初始化向量值(也是复杂化加密的一种方式),解密时还输出解密结果,见后文示例
-P:和-p选项作用相同,但是打印时直接退出工具,不进行加密或解密操作
-md:指定单向加密算法,默认md5。该算法是拿来加密key部分的,见后文分析。
支持的单向加密算法有:
- -md4 to use the md4 message digest algorithm
- -md5 to use the md5 message digest algorithm
- -ripemd160 to use the ripemd160 message digest algorithm
- -sha to use the sha message digest algorithm
- -sha1 to use the sha1 message digest algorithm
- -sha224 to use the sha224 message digest algorithm
- -sha256 to use the sha256 message digest algorithm
- -sha384 to use the sha384 message digest algorithm
- -sha512 to use the sha512 message digest algorithm
- -whirlpool to use the whirlpool message digest algorithm
支持的对称加密算法有:
- -aes--cbc -aes--cbc-hmac-sha1 -aes--cfb
- -aes--cfb1 -aes--cfb8 -aes--ctr
- -aes--ecb -aes--gcm -aes--ofb
- -aes--xts -aes--cbc -aes--cfb
- -aes--cfb1 -aes--cfb8 -aes--ctr
- -aes--ecb -aes--gcm -aes--ofb
- -aes--cbc -aes--cbc-hmac-sha1 -aes--cfb
- -aes--cfb1 -aes--cfb8 -aes--ctr
- -aes--ecb -aes--gcm -aes--ofb
- -aes--xts -aes128 -aes192
- -aes256 -bf -bf-cbc
- -bf-cfb -bf-ecb -bf-ofb
- -blowfish -camellia--cbc -camellia--cfb
- -camellia--cfb1 -camellia--cfb8 -camellia--ecb
- -camellia--ofb -camellia--cbc -camellia--cfb
- -camellia--cfb1 -camellia--cfb8 -camellia--ecb
- -camellia--ofb -camellia--cbc -camellia--cfb
- -camellia--cfb1 -camellia--cfb8 -camellia--ecb
- -camellia--ofb -camellia128 -camellia192
- -camellia256 -cast -cast-cbc
- -cast5-cbc -cast5-cfb -cast5-ecb
- -cast5-ofb -des -des-cbc
- -des-cfb -des-cfb1 -des-cfb8
- -des-ecb -des-ede -des-ede-cbc
- -des-ede-cfb -des-ede-ofb -des-ede3
- -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1
- -des-ede3-cfb8 -des-ede3-ofb -des-ofb
- -des3 -desx -desx-cbc
- -id-aes128-GCM -id-aes128-wrap -id-aes128-wrap-pad
- -id-aes192-GCM -id-aes192-wrap -id-aes192-wrap-pad
- -id-aes256-GCM -id-aes256-wrap -id-aes256-wrap-pad
- -id-smime-alg-CMS3DESwrap -idea -idea-cbc
- -idea-cfb -idea-ecb -idea-ofb
- -rc2 -rc2--cbc -rc2--cbc
- -rc2-cbc -rc2-cfb -rc2-ecb
- -rc2-ofb -rc4 -rc4-
- -rc4-hmac-md5 -seed -seed-cbc
- -seed-cfb -seed-ecb -seed-ofb
在给出openssl enc命令用法示例之前,先解释下对称加密和解密的原理和过程。
对称加解密时,它们使用的密码是完全相同的,例如"123456",但这是密码,且是明文密码,非常不安全,所以应该对此简单密码进行复杂化。最直接的方法是使用单向加密计算出明文密码的hash值,单向加密后新生成的密码已经比较安全(称之为密钥比较好),可以作为对称加密时的对称密钥。另外,由于同一单向加密算法对相同明文密码的计算结果是完全一致的,这样解密时使用相同的单向加密算法就能计算出完全相同的密钥,也就是解密时的对称密钥。如果想要更安全,还可以在对称加密后对加密文件进行重新编码,如使用"base64"、二进制或hex编码方式进行编码,但对应的在解密前就需要先解码,解码后才能解密。
所以,将对称加、解密的机制简单概括如下:
对称加密机制:根据指定的单向加密算法,对输入的明文密码进行单向加密(默认是md5),得到固定长度的加密密钥,即对称密钥,再根据指定的对称加密算法,使用对称密钥加密文件,最后重新编码加密后的文件。即单向加密明文密码结果作为对称密钥、使用对称密钥加密文件、对文件重新编码。
对称解密机制:先解码文件,再根据单向加密算法对解密时输入的明文密码计算得到对称密钥,依此对称密钥对称解密解码后的文件。
因此,解密过程中使用的解码方式、单向加密和对称加密算法都必须一致,且输入的密码必须是正确密码。但需要注意的一点是,解密时可以不指定salt,因为加密时使用的salt会记录下来,解密时可以读取该salt。
如下图所示,分别是加密和解密过程示意图。
示例:
以加密/etc/fstab的备份文件/tmp/test.txt为例。
(1).首先测试openssl enc的编码功能。由于未指定密码选项"-k"或"-pass",所以仅仅只进行编码而不进行加密,因此也不会提示输入密码。
- [root@xuexi tmp]# openssl enc -a -in test.txt -out test_base64.txt
- [root@xuexi tmp]# cat test_base64.txt
- CiMKIyAvZXRjL2ZzdGFiCiMgQ3JlYXRlZCBieSBhbmFjb25kYSBvbiBUaHUgTWF5
- IDExIDA0OjE3OjQ0IDIwMTcKIwojIEFjY2Vzc2libGUgZmlsZXN5c3RlbXMsIGJ5
- IHJlZmVyZW5jZSwgYXJlIG1haW50YWluZWQgdW5kZXIgJy9kZXYvZGlzaycKIyBT
- ZWUgbWFuIHBhZ2VzIGZzdGFiKDUpLCBmaW5kZnMoOCksIG1vdW50KDgpIGFuZC9v
- ciBibGtpZCg4KSBmb3IgbW9yZSBpbmZvCiMKVVVJRD1iMmE3MGZhZi1hZWE0LTRk
- OGUtOGJlOC1jNzEwOWFjOWM4YjggLyAgICAgICAgICAgICAgICAgICAgICAgeGZz
- ICAgICBkZWZhdWx0cyAgICAgICAgMCAwClVVSUQ9MzY3ZDZhNzctMDMzYi00MDM3
- LWJiY2ItNDE2NzA1ZWFkMDk1IC9ib290ICAgICAgICAgICAgICAgICAgIHhmcyAg
- ICAgZGVmYXVsdHMgICAgICAgIDAgMApVVUlEPWQ1MDUxMTNjLWRhYTYtNGMxNy04
- YjAzLWIzNTUxY2VkMjMwNSBzd2FwICAgICAgICAgICAgICAgICAgICBzd2FwICAg
- IGRlZmF1bHRzICAgICAgICAwIDAK
再以base64格式进行解码。
- [root@xuexi tmp]# openssl enc -a -d -in test_base64.txt
- #
- # /etc/fstab
- # Created by anaconda on Thu May ::
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(), findfs(), mount() and/or blkid() for more info
- #
- UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults
- UUID=367d6a77-033b--bbcb-416705ead095 /boot xfs defaults
- UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap swap defaults
实际上,上述编码和解码的过程严格地说也是对称加密和解密,因为openssl enc默认会带上加密选项"-e",只不过因为没有指定输入密码选项,使用的加密密码为空而已,且单向加密算法使用的也是默认值。解密时也一样。
(2).测试使用des3对称加密算法加密test.txt文件。
- [root@xuexi tmp]# openssl enc -a -des3 -in test.txt -out test.1 -pass pass:123456 -md md5
加密后,查看加密后文件test.1的结果。
- [root@xuexi tmp]# cat test.1
- U2FsdGVkX1+c/d4NsXnY6Pd7rcZjGSsMRJWQOP0s5sxH6aLE5iCYjKEAbGac//iR
- wkUUh6a57OpUA3+OOCKB4z+IxBcKo67BUDGR9vYeCfkobH9F+mSfVzZbXBrJmxwf
- 921tJ+8K+yKB6DjJfufpW+DWXmH8MFyvK60wnYHsfUQOp81EvaUtEfqEKIS8hgg7
- 4NTOyww+/VMDdc2wmkf08XNQUPlVtLaSx3vuBisxRdu8raiKWGGOB7qCwELCxDqu
- NaRCIh0VjjffGohAOMMsAQ2kFCDUKx0Z4Df5fvifhPXoHfsj2lI216BPG5Cy88K2
- KV78DoBm4pnMAymo/HRRF95LjvWYZIN88hIVN67u2j9zqSGeuyJakMyDVhYYmrHl
- sMr2YTbTwus2DiO6qAzt/0a9nocTVKfGR81Xsh0a0ZudjtrMl5H36YJawpldvUCa
- DzXPsbpQrp0VGi2HvJ4EVKKEx2uh8XYWmJ4ytj1s1wtCR6wQhmERtInGwULWTyI+
- agXStSB5XzsvAJRJvexsaNycj5lAoQ8O6YXEj7B0inB7nBQTFbwkXyvJqXpr1179
- i67leYc59OvlhRMA+GLW4g/Mg5dN5SBmgt1ChOJs4887zAUyLYrLvR4zDK6IQN/M
- P6F15c9V+m9pw2t32sUQQmYrYqOV/AQf0t0EwvA0Myjmfqtvmp555Q==
解密文件test.1。
- [root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -out test.2 -pass pass:123456 -md md5
- [root@xuexi tmp]# cat test.2
- #
- # /etc/fstab
- # Created by anaconda on Thu May ::
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(), findfs(), mount() and/or blkid() for more info
- #
- UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults
- UUID=367d6a77-033b--bbcb-416705ead095 /boot xfs defaults
- UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap swap defaults
(3).加密时带上点盐salt。其实不写时默认就已经加入了,只不过是加入随机盐值。使用-S可以指定明确要使用的盐的值。但是盐的值只能是16进制范围内字符的组合,即"0-9a-fA-F"的任意一个或多个组合。
- [root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5
解密。解密时不用指定salt值,即使指定了也不会影响解密结果。
- [root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5
- #
- # /etc/fstab
- # Created by anaconda on Thu May ::
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(), findfs(), mount() and/or blkid() for more info
- #
- UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults
- UUID=367d6a77-033b--bbcb-416705ead095 /boot xfs defaults
- UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap swap defaults
- [root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabcxdasd' -in test.1 -pass pass:123456 -md md5
- #
- # /etc/fstab
- # Created by anaconda on Thu May ::
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(), findfs(), mount() and/or blkid() for more info
- #
- UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults
- UUID=367d6a77-033b--bbcb-416705ead095 /boot xfs defaults
- UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap swap defaults
(4).在测试下"-p"和"-P"选项的输出功能。小写字母p不仅输出密钥算法结果,还输出加解密的内容,而大写字母P则只输出密钥算法结果。
加密时的情况。
- [root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5 -p
- salt=FABC000000000000
- key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
- iv =5128FDED01EE1499
其中key就是单向加密明文密码后得到的对称密钥,iv是密码运算时使用的向量值。
再看解密时的情况,此处加上了salt。
- [root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabc' -in test.1 -pass pass:123456 -md md5 -P
- salt=FABC000000000000
- key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
- iv =5128FDED01EE1499
若解密时不指定salt,或者随意指定salt,结果如下。
- [root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5 -P
- salt=FABC000000000000
- key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
- iv =5128FDED01EE1499
- [root@xuexi tmp]# openssl enc -a -des3 -S 'FabM' -d -in test.1 -pass pass:123456 -md md5 -P
- salt=FABC000000000000
- key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
- iv =5128FDED01EE1499
可见,解密时,只要指定和加密时相同编码格式和单向加密算法,密钥的结果就是一样的,且解密时明确指定salt是无意义的,因为它可以读取到加密时使用的salt。
甚至,解密时指定不同的对称加密算法,密钥结果也是一样的。
- [root@xuexi tmp]# openssl enc -a -desx -d -in test.1 -pass pass:123456 -md md5 -p
- salt=FABC000000000000
- key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
- iv =5128FDED01EE1499
由此,能推理出对称加密时使用的对称密钥和对称算法是毫无关系的。
openssl enc(对称加密)的更多相关文章
- (9) openssl enc(对称加密)
对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl enc -ciphername [-in filename] [-out filename] [-pa ...
- openssl evp 对称加密(AES_ecb,ccb)
openssl evp 对称加密(AES_ecb,ccb) evp.h 封装了openssl常用密码学工具,以下主要说对称加密的接口 1. 如下使用 aes_256_ecb 模式的加密解密测试代码 u ...
- openssl enc 加解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Openssl enc命令
一.简介 enc - 对称加密例程,使用对称密钥对数据进行加解密,特点是速度快,能对大量数据进行处理.算法有流算法和分组加密算法,流算法是逐字节加,由于其容易被破译,现在已很少使用:分组加密算法是将数 ...
- openssl可以实现:秘钥证书管理、对称加密和非对称加密
openssl enc -e -aes-128-cbc -iv 0102030405060708 -K 1234567890123456 -in input.xml -out output.xml( ...
- openssl 下的对称加密和非对称加密
对称加密: 在加密和解密过程中使用相同的密钥, 或是两个可以简单地相互推算的密钥的加密算法. 非对称加密: 也称为公开加密, 它需要一个密钥对, 一个是公钥, 一个是私钥, 一个负责加密, 一个负责解 ...
- openssl之aes对称加密
AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法. 对称加密:用同一个密码 加密/解密 文件. 使用openssl中 ...
- PHP的OpenSSL加密扩展学习(一):对称加密
我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚 ...
- iOS CommonCrypto 对称加密 AES ecb,cbc
CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...
随机推荐
- mac下crontab定时任务使用
这篇文章的作用 BREAK TIME 本地pc配置定时任务,开机后每隔一小时执行一次,open这个页面,休息半分钟 cron创建备忘 首先创建定时任务 crontab -e 0 */ * * * op ...
- Gitee(码云)、Github同时配置ssh key
一.cd ~/.ssh 二.通过下面的命令,依次生成两个平台的key $ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "github ...
- Redhat7配置ali-yum源
1.删除所有包 rpm -qa|grep yum|xargs rpm -e --nodeps 2.下载相关文件 下载地址 https://mirrors.aliyun.com/centos/7/os ...
- 新特技软件(Analyzer)添加新用户
新特技软件添加新用户的步骤比较多,记录下来,方便以后使用 安装完软件,处理好自己的AS以后,准备添加用户 步骤一: 我们要在安装Analyzer的服务器上添加新的Windows用户 步骤二:在Anal ...
- c# 反射小Demo
今天看了一下C#的反射,之前一直感觉反射是一种很高大上的东东,现在才发现不过是纸老虎而以. 所谓的反射就是,只是知道一个它是一个对象不知道其中有什么字段方法属性等,而反射就是用来获取一个未知对象的字段 ...
- Virtio: An I/O virtualization framework for Linux
The Linux kernel supports a variety of virtualization schemes, and that's likely to grow as virtuali ...
- Akka-CQRS(0)- 基于akka-cluster的读写分离框架,构建gRPC移动应用后端架构
上一篇我们讨论了akka-cluster的分片(sharding)技术.在提供的例子中感觉到akka这样的分布式系统工具特别适合支持大量的带有内置状态的,相对独立完整的程序在集群节点上分布运算.这里重 ...
- C#通过COM组件操作IE浏览器(一):打开浏览器跳转到指定网站
简介Internet Explorer对象模型 1.属性 属性 类型 描述 Application Object 返回对Internet Explorer对象的引用. Busy Boolean 返回一 ...
- 每天学点SpringCloud(六):Hystrix使用
Hystrix是一个实现断路器模式的库.什么是断路器模式呢?就像我们家庭中的电闸一样,如果有那一处出现意外,那么电闸就会立刻跳闸来防止因为这一处意外而引起更大的事故,直到我们确认处理完那一处意外后才可 ...
- 查看windows到期时间
查看windows到期时间 Slmgr.vbs -xpr