openssl enc 加解密


國內私募機構九鼎控股打造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.   
  6. E:\OpenSSL\foo>openssl enc -P -des3 -pass pass:123  -in a.txt  
  7. salt=2D89EA80CDE7700E  
  8. key=825A74419BADD6A82D6DD9ECD9404397EB5AFC020A75D511  
  9. 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.   
  6. E:\OpenSSL\foo>xxd a.des3salt  
  7. 0000000: 5361 6c74 6564 5f5f a254 906c a471 c1d4  Salted__.T.l.q..  
  8. 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.   
  3. E:\OpenSSL\foo>diff a.txt a.dec  
  4.   
  5. 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.   
  3. E:\OpenSSL\foo>openssl enc -des3 -d -a -k 123 -in a.des3base64 -out b.txt  
  4.   
  5. 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.   
  3. bf-cbc             Blowfish in CBC mode  
  4. bf                 Alias for bf-cbc  
  5. bf-cfb             Blowfish in CFB mode  
  6. bf-ecb             Blowfish in ECB mode  
  7. bf-ofb             Blowfish in OFB mode  
  8.   
  9. cast-cbc           CAST in CBC mode  
  10. cast               Alias for cast-cbc  
  11. cast5-cbc          CAST5 in CBC mode  
  12. cast5-cfb          CAST5 in CFB mode  
  13. cast5-ecb          CAST5 in ECB mode  
  14. cast5-ofb          CAST5 in OFB mode  
  15.   
  16. des-cbc            DES in CBC mode  
  17. des                Alias for des-cbc  
  18. des-cfb            DES in CBC mode  
  19. des-ofb            DES in OFB mode  
  20. des-ecb            DES in ECB mode  
  21.   
  22. des-ede-cbc        Two key triple DES EDE in CBC mode  
  23. des-ede            Two key triple DES EDE in ECB mode  
  24. des-ede-cfb        Two key triple DES EDE in CFB mode  
  25. des-ede-ofb        Two key triple DES EDE in OFB mode  
  26.   
  27. des-ede3-cbc       Three key triple DES EDE in CBC mode  
  28. des-ede3           Three key triple DES EDE in ECB mode  
  29. des3               Alias for des-ede3-cbc  
  30. des-ede3-cfb       Three key triple DES EDE CFB mode  
  31. des-ede3-ofb       Three key triple DES EDE in OFB mode  
  32.   
  33. desx               DESX algorithm.  
  34.   
  35. gost89             GOST 28147-89 in CFB mode (provided by ccgost engine)  
  36. gost89-cnt        `GOST 28147-89 in CNT mode (provided by ccgost engine)  
  37.   
  38. idea-cbc           IDEA algorithm in CBC mode  
  39. idea               same as idea-cbc  
  40. idea-cfb           IDEA in CFB mode  
  41. idea-ecb           IDEA in ECB mode  
  42. idea-ofb           IDEA in OFB mode  
  43.   
  44. rc2-cbc            128 bit RC2 in CBC mode  
  45. rc2                Alias for rc2-cbc  
  46. rc2-cfb            128 bit RC2 in CFB mode  
  47. rc2-ecb            128 bit RC2 in ECB mode  
  48. rc2-ofb            128 bit RC2 in OFB mode  
  49. rc2-64-cbc         64 bit RC2 in CBC mode  
  50. rc2-40-cbc         40 bit RC2 in CBC mode  
  51.   
  52. rc4                128 bit RC4  
  53. rc4-64             64 bit RC4  
  54. rc4-40             40 bit RC4  
  55.   
  56. rc5-cbc            RC5 cipher in CBC mode  
  57. rc5                Alias for rc5-cbc  
  58. rc5-cfb            RC5 cipher in CFB mode  
  59. rc5-ecb            RC5 cipher in ECB mode  
  60. rc5-ofb            RC5 cipher in OFB mode  
  61.   
  62. aes-[128|192|256]-cbc  128/192/256 bit AES in CBC mode  
  63. aes-[128|192|256]      Alias for aes-[128|192|256]-cbc  
  64. aes-[128|192|256]-cfb  128/192/256 bit AES in 128 bit CFB mode  
  65. aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode  
  66. aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode  
  67. aes-[128|192|256]-ecb  128/192/256 bit AES in ECB mode  
  68. aes-[128|192|256]-ofb  128/192/256 bit AES in OFB mode  

注意上面的ecb,cbc,ofb,cfb等,這些是分組算法的工作模式,默認為cbc。

ECB是最簡單的,如圖

 

CBC是應用最廣泛的,如圖

在加密第一組數據的時候,使用了IV,且每組數據加加密前都與前組加密后的數據進行異或,提高了安全性。不同的IV可以產生不同的密文(這和不同的salt可以產生不同的密文,應該不矛盾,本人菜鳥^_^),這樣明文的統計特征會在密文中消散掉。IV不需要保密


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM