国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。 
------------------------------------------------------------------------------------------------------------------------------------------------------------------

地址: http://blog.csdn.net/fym0121/article/details/7984733

介绍

enc - 对称加密例程,使用对称密钥对数据进行加解密,特点是速度快,能对大量数据进行处理。算法有流算法和分组加密算法,流算法是逐字节加密,数据经典算法,但由于其容易被破译,现在已很少使用;分组加密算法是将数据分成固定大小的组里,然后逐组进行加密,比较广为人知的是DES3。分组算法中又有ECB,CBC,CFB,OFB,CTR等工作模式,其中默认选CBC工作模式。

语法

openssl enc -ciphername[-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

enc 主命令,虽然直接调用加密算法名字也行,例如:

  1. openssl des3 -pass pass:"123" -in a.txt -out a.txt.des3

但是不推荐使用,理由是这种调用形式对于需要硬件引擎的算法不能正常工作(算法,可以由硬件完成)。

-in / -out   filename    输入待加解密的文件,输出加解密后的文件

-pass arg

-pass 提供了几种传入密码的方式。传统是利用-k 选项传入密码的。(关于环境变量,文件描述符,请参阅相关文献)

  1. -pass pass:"123"      #密码是123
  2. -pass pass:123        #密码是123
  3. -pass evn:VAR         #密码从环境变量VAR中去
  4. -pass file:p.txt      #密码从文件p.txt第一行去,不包括换行符,注意DOS格式的^M及回车符。
  5. -pass fd:3            #密码从文件描述符3中读
  6. -pass stdin           #标准输入

-salt     加盐,这是开启的默认选项,使用-nosalt已明确关闭此选项,除非为了兼容性的考虑,否则在新程序中请使用此选项。这是一个神奇的选项,加盐后,相同的明文可以得到不同的密文。默认情况下,盐值是随机生成的,可以使用-S选项明确指定盐值。

  1. E:\OpenSSL\foo>openssl enc -P -des3 -pass pass:123  -in a.txt
  2. salt=669E2AB46DA79FA0
  3. key=EFDB3D1EF18840FF7961E5346FCED81CD34D89286A106F71
  4. iv =2FBE944B72F3CA59
  5. E:\OpenSSL\foo>openssl enc -P -des3 -pass pass:123  -in a.txt
  6. salt=2D89EA80CDE7700E
  7. key=825A74419BADD6A82D6DD9ECD9404397EB5AFC020A75D511
  8. iv =152185CA47D212A0

有了盐值后,相同的明文可以产生不同的密文,那可以解密吗?当然可以。在密文中包含了盐值。例如:

  1. E:\OpenSSL\foo>openssl enc -p -des3 -pass pass:123  -in a.txt -out a.des3salt
  2. salt=A254906CA471C1D4
  3. key=15A12DB86A8A09ABB3C59C1712D865447D96AD1BC940CA56
  4. iv =264E495D7649F9F8
  5. E:\OpenSSL\foo>xxd a.des3salt
  6. 0000000: 5361 6c74 6564 5f5f a254 906c a471 c1d4  Salted__.T.l.q..
  7. 0000010: 952e 1995 b60d 1813                      ........

注意salt和a.des3salt中的a254 906c a471 c1d4是一样子的。我以前用POCO写了个加密程序,加密了一个文件,然后又用openssl加密了那个相同的文件,结果加密后的文件不一样,原来是盐值在搞怪。加盐,就是加调料,所以结果不一样了。

盐值(salt)不需要保密,为什么,看看《应用密码学》吧。

-e / -d         encrypt / decrypt 加解密。默认是加密,-d明确指定是解密。

  1. E:\OpenSSL\foo>openssl enc -d -des3 -pass pass:123  -in a.des3salt -out a.dec
  2. E:\OpenSSL\foo>diff a.txt a.dec
  3. E:\OpenSSL\foo>

-a              对加密后的数据进行base64编码,或解密前,先对数据进行base64解码。 -base64与-a选项相同。

  1. E:\OpenSSL\foo>openssl enc -des3 -a -k 123 -in a.txt -out a.des3base64
  2. E:\OpenSSL\foo>openssl enc -des3 -d -a -k 123 -in a.des3base64 -out b.txt
  3. E:\OpenSSL\foo>diff a.txt b.txt

-A              如果指定-a 选项,在每一行上进行base64处理。

-k /  -kfile     -k,传统输入密码的方式,-k 123 相当与 -pass pass:123 。-kfile p.txt 相当于 -pass file:p.txt。

-K  key     加密真正使用的key。这和-k 和 -pass有什么区别呢? 其实我们输入的密码并不是加密时使用的密钥,对于分组加密算法来说,密钥是固定的,有64/128/256等,我们也经常见文献里写着,密钥多少多少位。我们输入的密码,在加密算法启动前,会经过运算,得到固定长度用于加密的key,然后在加密。我们可以在选项中手动指定key,key的格式是16进制,算法的不同,key的长度也会不同。

-iv IV      IV是初始化向量,格式是16进制。在分组加密算法中,对第一组数据加密时,我们可以是用初始化向量对其进行处理,已隐藏明文的统计特性。参加下面的工作模式。

-p / -P    print打印出key和iv值。-P只打印出key和iv值,而不进行加解密运算。参考-salt

算法

除了上面提到的des3外,openssl还提供了那些算法呢?

  1. E:\OpenSSL\foo>openssl enc -help

这里是官方文档,做的整理

  1. base64             Base 64
  2. bf-cbc             Blowfish in CBC mode
  3. bf                 Alias for bf-cbc
  4. bf-cfb             Blowfish in CFB mode
  5. bf-ecb             Blowfish in ECB mode
  6. bf-ofb             Blowfish in OFB mode
  7. cast-cbc           CAST in CBC mode
  8. cast               Alias for cast-cbc
  9. cast5-cbc          CAST5 in CBC mode
  10. cast5-cfb          CAST5 in CFB mode
  11. cast5-ecb          CAST5 in ECB mode
  12. cast5-ofb          CAST5 in OFB mode
  13. des-cbc            DES in CBC mode
  14. des                Alias for des-cbc
  15. des-cfb            DES in CBC mode
  16. des-ofb            DES in OFB mode
  17. des-ecb            DES in ECB mode
  18. des-ede-cbc        Two key triple DES EDE in CBC mode
  19. des-ede            Two key triple DES EDE in ECB mode
  20. des-ede-cfb        Two key triple DES EDE in CFB mode
  21. des-ede-ofb        Two key triple DES EDE in OFB mode
  22. des-ede3-cbc       Three key triple DES EDE in CBC mode
  23. des-ede3           Three key triple DES EDE in ECB mode
  24. des3               Alias for des-ede3-cbc
  25. des-ede3-cfb       Three key triple DES EDE CFB mode
  26. des-ede3-ofb       Three key triple DES EDE in OFB mode
  27. desx               DESX algorithm.
  28. gost89             GOST 28147-89 in CFB mode (provided by ccgost engine)
  29. gost89-cnt        `GOST 28147-89 in CNT mode (provided by ccgost engine)
  30. idea-cbc           IDEA algorithm in CBC mode
  31. idea               same as idea-cbc
  32. idea-cfb           IDEA in CFB mode
  33. idea-ecb           IDEA in ECB mode
  34. idea-ofb           IDEA in OFB mode
  35. rc2-cbc            128 bit RC2 in CBC mode
  36. rc2                Alias for rc2-cbc
  37. rc2-cfb            128 bit RC2 in CFB mode
  38. rc2-ecb            128 bit RC2 in ECB mode
  39. rc2-ofb            128 bit RC2 in OFB mode
  40. rc2-64-cbc         64 bit RC2 in CBC mode
  41. rc2-40-cbc         40 bit RC2 in CBC mode
  42. rc4                128 bit RC4
  43. rc4-64             64 bit RC4
  44. rc4-40             40 bit RC4
  45. rc5-cbc            RC5 cipher in CBC mode
  46. rc5                Alias for rc5-cbc
  47. rc5-cfb            RC5 cipher in CFB mode
  48. rc5-ecb            RC5 cipher in ECB mode
  49. rc5-ofb            RC5 cipher in OFB mode
  50. aes-[128|192|256]-cbc  128/192/256 bit AES in CBC mode
  51. aes-[128|192|256]      Alias for aes-[128|192|256]-cbc
  52. aes-[128|192|256]-cfb  128/192/256 bit AES in 128 bit CFB mode
  53. aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
  54. aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
  55. aes-[128|192|256]-ecb  128/192/256 bit AES in ECB mode
  56. aes-[128|192|256]-ofb  128/192/256 bit AES in OFB mode

注意上面的ecb,cbc,ofb,cfb等,这些是分组算法的工作模式,默认为cbc。

ECB是最简单的,如图

CBC是应用最广泛的,如图

在加密第一组数据的时候,使用了IV,且每组数据加加密前都与前组加密后的数据进行异或,提高了安全性。不同的IV可以产生不同的密文(这和不同的salt可以产生不同的密文,应该不矛盾,本人菜鸟^_^),这样明文的统计特征会在密文中消散掉。IV不需要保密。

openssl enc 加解密的更多相关文章

  1. OpenSSL aes加解密实例+base64编解码

    OpenSSL aes加解密简单实例+base64编解码 #include <stdio.h> #include <string.h> #include <memory. ...

  2. openssl - rsa加解密例程

    原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加 ...

  3. Openssl aes加解密例程 更进一步

    原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...

  4. OpenSSL RSA加解密 (.Net公钥加密/ Linux端私钥解密)

    要求在.Net端生成公钥私钥对. 然后在.Net端使用RSA公钥加密:在Linux端使用RSA私钥解密. 最初的尝试是:.Net端使用RSACryptoServiceProvider; linux端使 ...

  5. openssl rsa 加解密

    <h4>1.openssl进行rsa加密解密</h4>首先介绍下命令台下openssl工具的简单使用:生成一个密钥:<pre lang="c" esc ...

  6. Openssl aes加解密例程

    原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...

  7. PHP openssl DES加解密

    不说废话上代码 加密 $str_padded = 'android'; //要加密的字符串 $iv = "12345678"; 偏移值 cbc必填 "\x01\x02\x ...

  8. PHP使用OPENSSL RSA加密解密数据

    加密数据有很多种方法,今天我们来看一下OPENSSL RSA的加密办法. 1.首先得安装php的openssl扩展 php -m | grep openssl 执行以上命令,确保已经安装了openss ...

  9. Openssl 加解密文件

    使用openssl 的命令行进行文件的加密与解密过程,主要有两种方式: openssl 指定加密/解密算法加密 openssl 指定公钥/私钥文件加密 openssl 指定加密/解密算法加密 To E ...

随机推荐

  1. git svn rebase出现了checksum mismatch的错误

    http://stackoverflow.com/questions/3156744/git-svn-rebase-checksum-mismatch This solution was the on ...

  2. [转] android自动化之MonkeyRunner测试环境配置(一)

    Android自动化测试之MonkeyRunner 一.Android自动化测试之环境搭建 1.1  Android-sdk介绍 ¢ SDK(Software development kit)软件开发 ...

  3. 大四实习准备5_android广播机制

    2015-5-1 android 广播机制 5.1简介 分为标准广播(Normal broadcasts)(无先后顺序,几乎同时接收,不可截断)和有序广播(Ordered broadcasts)(有先 ...

  4. poj3275

    比较笨啊,一直在想,到底问几次绝对能知道所有的关系呢? 后来看了题解才知道,问一次最少确定一对关系………… 这就好办le,n头牛有C(2,n)个关系 现在给出m条边,以确定的关系有多少呢?直接dfs啊 ...

  5. poj2001 Shortest Prefixes (trie)

    读入建立一棵字母树,并且每到一个节点就增加这个节点的覆盖数. 然后再重新扫一遍,一旦碰到某个覆盖数为1就是这个单词的最短前缀了. 不知为何下面的程序一直有bug……不知是读入的问题? type nod ...

  6. 关于Azure存储账户中存储虚拟机VHD文件的注意事项

     Joy Qiao from MSFT  Thu, Mar 12 2015 3:16 PM 我们在使用Azure时经常都会在Azure存储账户中放一些文件,包括Azure虚机的VHD文件也都是放在存储 ...

  7. Java 程序员在写 SQL 时常犯的 10 个错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

  8. nginx.conf配置

    在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processe ...

  9. [转载]DIV CSS设计时IE6、IE7、FF 与兼容性有关的特性

    在网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV CSS设计的网,就应该更注意IE6 IE7 FF对CSS样式的兼容,不然,你的网乱可能出去不想出现的效果! 所有浏览器 ...

  10. java中接口与多重继承的关系

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...