當前位置:首頁 » 密碼管理 » openssl3des加密

openssl3des加密

發布時間: 2022-12-29 17:28:48

① openssl 3des 線程安全嗎

3DES需要的輸入明文長度、密文長度都是8的整數倍

② 關於openssl AES/ECB/PKCS5Padding加密 求助

3DES需要的輸入明文長度、密文長度都是8的整數倍。

而CBC.CFB都需要初始化向量的參數才能加密、解密、。

③ 開發中常見的加密方式及應用

開發中常見的加密方式及應用

一、base64

簡述:Base64是網路上最常見的用於傳輸8Bit 位元組碼 的編碼方式之一,Base64就是一種基於64個可列印字元來表示二進制數據的方法。所有的數據都能被編碼為並只用65個字元就能表示的文本文件。( 65字元:A~Z a~z 0~9 + / = )編碼後的數據~=編碼前數據的4/3,會大1/3左右(圖片轉化為base64格式會比原圖大一些)。

應用:Base64編碼是從二進制到字元的過程,可用於在 HTTP 環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64來將一個較長的唯一 標識符 (一般為128-bit的UUID)編碼為一個字元串,用作HTTP 表單 和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制 數據編碼 為適合放在URL(包括隱藏 表單域 )中的形式。此時,採用Base64編碼具有不可讀性,需要解碼後才能閱讀。

命令行進行Base64編碼和解碼

編碼:base64 123.png -o 123.txt

解碼:base64 123.txt -o test.png -D Base64編碼的原理

原理:

1)將所有字元轉化為ASCII碼;

2)將ASCII碼轉化為8位二進制;

3)將二進制3個歸成一組(不足3個在後邊補0)共24位,再拆分成4組,每組6位;

4)統一在6位二進制前補兩個0湊足8位;

5)將補0後的二進制轉為十進制;

6)從Base64編碼表獲取十進制對應的Base64編碼;

Base64編碼的說明:

a.轉換的時候,將三個byte的數據,先後放入一個24bit的緩沖區中,先來的byte占高位。

b.數據不足3byte的話,於緩沖區中剩下的bit用0補足。然後,每次取出6個bit,按照其值選擇查表選擇對應的字元作為編碼後的輸出。

c.不斷進行,直到全部輸入數據轉換完成。

d.如果最後剩下兩個輸入數據,在編碼結果後加1個「=」;

e.如果最後剩下一個輸入數據,編碼結果後加2個「=」;

f.如果沒有剩下任何數據,就什麼都不要加,這樣才可以保證資料還原的正確性。

二、HASH加密/單向散列函數

簡述:Hash演算法特別的地方在於它是一種單向演算法,用戶可以通過Hash演算法對目標信息生成一段特定長度(32個字元)的唯一的Hash值,卻不能通過這個Hash值重新獲得目標信息。對用相同數據,加密之後的密文相同。 常見的Hash演算法有MD5和SHA。由於加密結果固定,所以基本上原始的哈希加密已經不再安全,於是衍生出了加鹽的方式。加鹽:先對原始數據拼接固定的字元串再進行MD5加密。

特點:

1) 加密 後密文的長度是定長(32個字元的密文)的

2)如果明文不一樣,那麼散列後的結果一定不一樣

3)如果明文一樣,那麼加密後的密文一定一樣(對相同數據加密,加密後的密文一樣)

4)所有的加密演算法是公開的

5)不可以逆推反算(不能根據密文推算出明文),但是可以暴力 破解 ,碰撞監測

原理:MD5消息摘要演算法,屬Hash演算法一類。MD5演算法對輸入任意長度的消息進行運行,產生一個128位的消息摘要。

1)數據填充

對消息進行數據填充,使消息的長度對512取模得448,設消息長度為X,即滿足X mod 512=448。根據此公式得出需要填充的數據長度。

填充方法:在消息後面進行填充,填充第一位為1,其餘為0。

2)添加信息長度

在第一步結果之後再填充上原消息的長度,可用來進行的存儲長度為64位。如果消息長度大於264,則只使用其低64位的值,即(消息長度 對264取模)。

在此步驟進行完畢後,最終消息長度就是512的整數倍。

3)數據處理

准備需要用到的數據:

4個常數:A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;

4個函數:F(X,Y,Z)=(X & Y) | ((~X) & Z);G(X,Y,Z)=(X & Z) | (Y & (~Z));H(X,Y,Z)=X ^ Y ^ Z;I(X,Y,Z)=Y ^ (X | (~Z));

把消息分以512位為一分組進行處理,每一個分組進行4輪變換,以上面所說4個常數為起始變數進行計算,重新輸出4個變數,以這4個變數再進行下一分組的運算,如果已經是最後一個分組,則這4個變數為最後的結果,即MD5值。

三、對稱加密

經典演算法:

1)DES數據加密標准

DES演算法的入口參數有三個:Key、Data、Mode。其中Key為8個位元組共64位,是DES演算法的工作密鑰;Data也為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。

DES演算法是這樣工作的:如Mode為加密,則用Key去把數據Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網路的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然後以密碼形式在公共通信網(如電話網)中傳輸到通信網路的終點,數據到達目的地後,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。

2)3DES使用3個密鑰,對消息進行(密鑰1·加密)+(密鑰2·解密)+(密鑰3·加密)

3)AES高級加密標准

如圖,加密/解密使用相同的密碼,並且是可逆的

四、非對稱加密

特點:

1)使用公鑰加密,使用私鑰解密

2)公鑰是公開的,私鑰保密

3)加密處理安全,但是性能極差

經典演算法RSA:

1)RSA原理

(1)求N,准備兩個質數p和q,N = p x q

(2)求L,L是p-1和q-1的最小公倍數。L = lcm(p-1,q-1)

(3)求E,E和L的最大公約數為1(E和L互質)

(4)求D,E x D mode L = 1

五、數字簽名

原理以及應用場景:

1)數字簽名的應用場景

需要嚴格驗證發送方身份信息情況

2)數字簽名原理

(1)客戶端處理

對"消息"進行HASH得到"消息摘要"

發送方使用自己的私鑰對"消息摘要"加密(數字簽名)

把數字簽名附著在"報文"的末尾一起發送給接收方

(2)服務端處理

對"消息" HASH得到"報文摘要"

使用公鑰對"數字簽名"解密

對結果進行匹配

六、數字證書

簡單說明:

證書和駕照很相似,裡面記有姓名、組織、地址等個人信息,以及屬於此人的公鑰,並有認證機構施加數字簽名,只要看到公鑰證書,我們就可以知道認證機構認證該公鑰的確屬於此人。

數字證書的內容:

1)公鑰

2)認證機構的數字簽名

證書的生成步驟:

1)生成私鑰openssl genrsa -out private.pem 1024

2)創建證書請求openssl req -new -key private.pem -out rsacert.csr

3)生成證書並簽名,有效期10年openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt

4)將PEM格式文件轉換成DER格式openssl x509 -outform der -in rsacert.crt -out rsacert.der

5)導出P12文件openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt

iOS開發中的注意點:

1)在iOS開發中,不能直接使用PEM格式的證書,因為其內部進行了Base64編碼,應該使用的是DER的證書,是二進制格式的;

2)OpenSSL默認生成的都是PEM格式的證書。

七、https

HTTPS和HTTP的區別:

超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。

HTTPS和HTTP的區別主要為以下四點:

1)https協議需要到ca申請證書,一般免費證書很少,需要交費。

2)http是 超文本傳輸協議 ,信息是明文傳輸,https則是具有 安全性 的 ssl 加密傳輸協議。

3)http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。

4)http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的 網路協議 ,比http協議安全。

5)SSL:Secure Sockets Layer安全套接字層;用數據加密(Encryption)技術,可確保數據在網路上傳輸過程中不會被截取及竊聽。目前一般通用之規格為40 bit之安全標准,美國則已推出128 bit之更高安全標准,但限制出境。只要3.0版本以上之I.E.或Netscape 瀏覽器 即可支持SSL。目前版本為3.0。SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密密鑰等。

④ OpenSSL 功能介紹

1 概述

OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。

OpenSSL是實現安全套接字層(SSL v2 / v3)和傳輸層安全(TLS v1)網路協議及其所需的相關加密標準的加密工具包。

OpenSSL:開源項目

三個組件:

openssl: 多用途的命令行工具,包openssl

libcrypto: 加密演算法庫,包openssl-libs

libssl:加密模塊應用庫,實現了ssl及tls,包nss

.openssl命令:

兩種運行模式:交互模式和批處理模式

opensslversion:程序版本號

標准命令、消息摘要命令、加密命令

標准命令:enc, ca, req, ...

查看幫助:openssl ?

可以通過openssl 來創建CA和頒發證書,文章 http://ghbsunny.blog.51cto.com/7759574/1964754

有做介紹,本文僅介紹openssl這個工具包的其他常用功能

2 案例介紹

2.1 對稱加密

工具:openssl  enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已經介紹

演算法:3des, aes, blowfish, twofish

.enc命令:

對稱密碼命令允許使用基於密碼或明確提供的密鑰的各種塊和流密碼來加密或解密數據。 Base64編碼或解碼也可以通過本身或加密或解密來執行。

The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.

幫助:man enc

例子

加密文件

以下命令運行需要輸入一個密碼,當解密的時候需要輸入相同的密碼才能解密,這里新生成的文件後綴名不一定是cipher,可以自己指定

openssl enc  -e -des3 -a -salt -in testfile   -out testfile.cipher

解密文件

openssl  enc   -d -des3 -a -salt –in testfile.cipher -out testfile

2.2 公鑰加密

公鑰加密生成非對稱的密鑰

演算法:RSA, ELGamal

工具:gpg, openssl  rsautl(man rsautl)

數字簽名:

演算法:RSA, DSA, ELGamal

密鑰交換:

演算法:dh

DSA: Digital Signature Algorithm

DSS:Digital Signature Standard

RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母組合成RSA

RSA公鑰與私鑰主要用於數字簽名(Digital Signature)與認證(Authentication),我們一般也稱之為不對稱加密/解密。

2.2.1 生成密鑰對

幫助:man genrsa

.生成私鑰,這個生成密鑰的過程要掌握

openssl genrsa  -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

私鑰文件生成後,建議把許可權改成600,保護,放在被其他人查看密碼信息

私鑰里的文件,如果被拿到,沒有通過des這關鍵字加密的話,就相當於是明文

這個命令執行的時候,要輸入八位數的密碼,當要使用這個私鑰的時候需要輸入密碼

(umask 077; openssl genrsa –out test.key  –des 2048)

括弧表示子進程,結束後,umask就會恢復未默認的值,umask的值使得其他人和組都沒有任何許可權,是為了保護生成的私鑰

2.2.2 從私鑰中提取出公鑰,導出公鑰

公鑰推不出私鑰,私鑰可以推出公鑰

openssl  rsa  -in PRIVATEKEYFILE –pubout  –out PUBLICKEYFILE

Openssl  rsa  –in test.key  –pubout  –out test.key.pub

公鑰是公開的,可以不設置許可權,以上是生成公鑰

2.2.3 公鑰加密文件

openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file

-in 指定被加密的文件

-inkey 指定加密公鑰文件

-pubin 表面是用純公鑰文件加密

-out 指定加密後的文件

例子:

openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl

2.2.4 私鑰解密文件

openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file

-in 指定需要解密的文件

-inkey 指定私鑰文件

-out 指定解密後的文件

例子:

openssl rsautl -decrypt -in ftpssl -inkey test.key -out  ftpdec

2.3 單向加密

單向加密即獲取摘要

工具:md5sum, sha1sum, sha224sum,sha256sum…

openssl    dgst

dgst:摘要功能輸出所提供文件的消息摘要或十六進制形式的文件。 它們也可用於數字簽名和驗證。

The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.

.dgst命令:

幫助:man dgst

openssl  dgst  -md5 [-hex默認]  /PATH/SOMEFILE

openssl dgst  -md5 testfile

以上命令將文件生成一個固定長度的摘要值,演算法是md5,大小佔128bite

md5sum /PATH/TO/SOMEFILE

以上這兩個md5得到的結果是一樣的

.MAC: Message Authentication Code,單向加密(hash)的一種延伸應用,用於實現網路通信中保證所傳輸數據的完整性機制

MAC 消息認證碼,構造方法可以基於hash,也可以基於對稱加密演算法,HMAC是基於hash的消息認證碼。數據和密鑰作為輸入,摘要信息作為輸出,常用於認證。

源文檔

2.4 生成用戶密碼

passwd命令:

幫助:man sslpasswd

openssl  passwd  -1 -salt SALT

-1對應的就是hash的md5演算法

SALT:這里是鹽值,人為指定,使得同一密碼生成的加密值不一樣,最多8位,超過8位沒有意義,比如前面8位一樣,後面還有幾位數不一樣,這樣生成的密碼值是一樣的

openssl  passwd  -1 –salt centos

grub-md5-crypt同樣生成md5加密的口令,centos為鹽值

比如這里的密碼我都是輸入123,但是鹽值不一樣,一個是centos,一個是centos6,生成的加密值不一樣

2.5 生成隨機數

幫助:man sslrand

rand命令在播放隨機數生成器一次後輸出num偽隨機位元組。 與其他openssl命令行工具一樣,除了-rand選項中給出的文件外,PRNG種子使用文件$ HOME / .rnd或.rnd。 如果從這些來源獲得足夠的播種,將會寫回新的$ HOME / .rnd或.rnd文件。

The rand command outputs num pseudo-random bytes after seeding the random number generator once.  As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the  -rand option.  A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these   sources.

openssl  rand -base64|-hex NUM

指定數字生成隨機數,如果是-hex 後面的數值比如6,那麼生成的長度是12位,因為hex生成的隨機數是16進制組合的數,hex 後面的num是位元組數,一個16進制數佔用4位,半個位元組

base後面可以生成隨機密碼

base64 生成隨機的數,可以用任何字元,也可以把圖片保存成base64的格式,通過base64生成的圖片,可以

用base64來還原出圖片

NUM: 表示位元組數;-hex時,每個字元為十六進制,相當於4位二進制,出現的字元數為NUM*2

3 總結

openssl還有很多用法,本文僅單純介紹了其中一部分,更多用法請使用幫助 man openssl 進行查看

⑤ openssl 測試加密速度,咋看呀

做為1024輔ede3中徑:44443 ede3在2.93sthe數字是在上千位元組每秒processed.type 1024bytesdes ede3 15575.4 求採納 謝謝 !!

⑥ openssl 加密演算法區別

openssl加密演算法區別是:RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗簽,DSA則只能用於簽名。至於SHA則是一種和md5相同的演算法。

它不是用於加密解密或者簽名的,它被稱為摘要演算法。就是通過一種演算法,依據數據內容生成一種固定長度的摘要,這串摘要值與原數據存在對應關系,就是原數據會生成這個摘要,但是,這個摘要是不能還原成原數據的。

正常情況下是這樣的,這個演算法起的作用就是,如果你把原數據修改一點點,那麼生成的摘要都會不同,傳輸過程中把原數據給你再給你一個摘要,你把得到的原數據同樣做一次摘要演算法,與給你的摘要相比較就可以知道這個數據有沒有在傳輸過程中被修改了。

openssl加密演算法的實際運用:

實際應用過程中,因為需要加密的數據可能會很大,進行加密費時費力,所以一般都會把原數據先進行摘要,然後對這個摘要值進行加密,將原數據的明文和加密後的。

摘要值一起傳給你。這樣你解開加密後的摘要值,再和你得到的數據進行的摘要值對應一下就可以知道數據有沒有被修改了。

而且,因為私鑰只有你有,只有你能解密摘要值,所以別人就算把原數據做了修改,然後生成一個假的摘要給你也是不行的,你這邊用密鑰也根本解不開。

⑦ openssl 如何使用

為一個基於密碼學的安全開發包,OpenSSL提供的功能相當強大和全面,囊括了主要的密碼演算法、常用的密鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程序供測試或其它目的使用。
1.對稱加密演算法
OpenSSL一共提供了8種對稱加密演算法,其中7種是分組加密演算法,僅有的一種流加密演算法是RC4。這7種分組加密演算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它演算法使用的則是64位。事實上,DES演算法裡面不僅僅是常用的DES演算法,還支持三個密鑰和兩個密鑰3DES演算法。
2.非對稱加密演算法
OpenSSL一共實現了4種非對稱加密演算法,包括DH演算法、RSA演算法、DSA演算法和橢圓曲線演算法(EC)。DH演算法一般用戶密鑰交換。RSA演算法既可以用於密鑰交換,也可以用於數字簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於數據加密。DSA演算法則一般只用於數字簽名。
3.信息摘要演算法
OpenSSL實現了5種信息摘要演算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA演算法事實上包括了SHA和SHA1兩種信息摘要演算法,此外,OpenSSL還實現了DSS標准中規定的兩種信息摘要演算法DSS和DSS1。
4.密鑰和證書管理
密鑰和證書管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支持多種標准。
首先,OpenSSL實現了ASN.1的證書和密鑰相關標准,提供了對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開密鑰對和對稱密鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標准中提供了對私鑰的加密保護功能,使得密鑰可以安全地進行存儲和分發。
在此基礎上,OpenSSL實現了對證書的X.509標准編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文本資料庫,支持證書的管理功能,包括證書密鑰產生、請求產生、證書簽發、吊銷和驗證等功能。
事實上,OpenSSL提供的CA應用程序就是一個小型的證書管理中心(CA),實現了證書簽發的整個流程和證書管理的大部分機制。
5.SSL和TLS協議
OpenSSL實現了SSL協議的SSLv2和SSLv3,支持了其中絕大部分演算法協議。OpenSSL也實現了TLSv1.0,TLS是SSLv3的標准化版,雖然區別不大,但畢竟有很多細節不盡相同。
雖然已經有眾多的軟體實現了OpenSSL的功能,但是OpenSSL裡面實現的SSL協議能夠讓我們對SSL協議有一個更加清楚的認識,因為至少存在兩點:一是OpenSSL實現的SSL協議是開放源代碼的,我們可以追究SSL協議實現的每一個細節;二是OpenSSL實現的SSL協議是純粹的SSL協議,沒有跟其它協議(如HTTP)協議結合在一起,澄清了SSL協議的本來面目。
6.應用程序
OpenSSL的應用程序已經成為了OpenSSL重要的一個組成部分,其重要性恐怕是OpenSSL的開發者開始沒有想到的。現在OpenSSL的應用中,很多都是基於OpenSSL的應用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的應用程序實現的。OpenSSL的應用程序是基於OpenSSL的密碼演算法庫和SSL協議庫寫成的,所以也是一些非常好的OpenSSL的API使用範例,讀懂所有這些範例,你對OpenSSL的API使用了解就比較全面了,當然,這也是一項鍛煉你的意志力的工作。
OpenSSL的應用程序提供了相對全面的功能,在相當多的人看來,OpenSSL已經為自己做好了一切,不需要再做更多的開發工作了,所以,他們也把這些應用程序成為OpenSSL的指令。OpenSSL的應用程序主要包括密鑰生成、證書管理、格式轉換、數據加密和簽名、SSL測試以及其它輔助配置功能。
7.Engine機制 Engine機制的出現是在OpenSSL的0.9.6版的事情,開始的時候是將普通版本跟支持Engine的版本分開的,到了OpenSSL的0.9.7版,Engine機制集成到了OpenSSL的內核中,成為了OpenSSL不可缺少的一部分。 Engine機制目的是為了使OpenSSL能夠透明地使用第三方提供的軟體加密庫或者硬體加密設備進行加密。OpenSSL的Engine機製成功地達到了這個目的,這使得OpenSSL已經不僅僅使一個加密庫,而是提供了一個通用地加密介面,能夠與絕大部分加密庫或者加密設備協調工作。當然,要使特定加密庫或加密設備更OpenSSL協調工作,需要寫少量的介面代碼,但是這樣的工作量並不大,雖然還是需要一點密碼學的知識。Engine機制的功能跟Windows提供的CSP功能目標是基本相同的。目前,OpenSSL的0.9.7版本支持的內嵌第三方加密設備有8種,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬體加密設備。現在還出現了支持PKCS#11介面的Engine介面,支持微軟CryptoAPI的介面也有人進行開發。當然,所有上述Engine介面支持不一定很全面,比如,可能支持其中一兩種公開密鑰演算法。
8.輔助功能
BIO機制是OpenSSL提供的一種高層IO介面,該介面封裝了幾乎所有類型的IO介面,如內存訪問、文件訪問以及Socket等。這使得代碼的重用性大幅度提高,OpenSSL提供API的復雜性也降低了很多。
OpenSSL對於隨機數的生成和管理也提供了一整套的解決方法和支持API函數。隨機數的好壞是決定一個密鑰是否安全的重要前提。
OpenSSL還提供了其它的一些輔助功能,如從口令生成密鑰的API,證書簽發和管理中的配置文件機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發現很多這樣的小功能,讓你不斷有新的驚喜。

⑧ iOS使用openSSL加密應該怎麼做

最近幾天折騰了一下如何在iOS上使用RSA來加密。iOS上並沒有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我們可以通過製作自簽名的x509證書(由於對安全性要求不高,我們並不需要使用CA認證的證書),再調用x509的相關API來進行加密。接下來記錄一下整個流程。
第一步,製作自簽名的證書
1.最簡單快捷的方法,打開Terminal,使用openssl(Mac OS X自帶)生成私鑰和自簽名的x509證書。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示輸入內容就行了。
幾個說明:
public_key.der是輸出的自簽名的x509證書,即我們要用的。
private_key.pem是輸出的私鑰,用來解密的,請妥善保管。
rsa:1024這里的1024是密鑰長度,1024是比較安全的,如果需要更安全的話,可以用2048,但是加解密代價也會增加。
-days:證書過期時間,一定要加上這個參數,默認的證書過期時間是30天,一般我們不希望證書這么短就過期,所以寫上比較合適的天數,例如這里的3650(10年)。
事實上,這一行命令包含了好幾個步驟(我研究下面這些步驟的原因是我手頭已經由一個private_key.pem私鑰了,想直接用這個來生成x509證書,也就是用到了下面的2-3)
1)創建私鑰
openssl genrsa -out private_key.pem 1024
2)創建證書請求(按照提示輸入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自簽署根證書
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.驗證證書。把public_key.der拖到xcode中,如果文件沒有問題的話,那麼就可以直接在xcode中打開,看到證書的各種信息。

第二步,使用public_key.der來進行加密。
1.導入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.從public_key.der讀取公鑰。
4.加密。
下面是參考代碼(只能用於加密長度小於等於116位元組的內容,適合於對密碼進行加密。使用了ARC,不過還是要注意部分資源需要使用CFRealse來釋放)
RSA.h
//
// RSA.h
//
#import Foundation.h>

@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}

- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;

@end

RSA.m
//
// RSA.m
//
#import "RSA.h"

@implementation RSA

- (id)init {
self = [super init];

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}

NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}

certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}

policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}

SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}

publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}

maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}

- (NSData *) encryptWithData:(NSData *)content {

size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}

void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];

size_t cipherLen = 128; // 當前RSA的密鑰長度是128位元組
void *cipher = malloc(cipherLen);

OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);

NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}

free(plain);
free(cipher);

return result;
}

- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}

- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}

@end

使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}

⑨ openssl加密數據為8倍數,怎麼多出8位

從編碼規則中我們要使用SHA1、Base64、3DES與URLEncoding 四種加密方法並且來回來加密. 我就不都單獨拿出來貼代碼了,直接貼比較全的代碼.
標簽: 加密 演算法 sha1 base64 3DES OpenSSL
代碼片段(1)
[代碼] [C/C++/Objective-C]代碼
view source
print?
001 /**
002 * Creator: WangBin, 2009-11-26
003 * For encrypt...
004 * I cant't verify those code, What the fuck 0f 3des, Make me always get the different result.Bad thing is the memory, should be careful of those free.
005 *
006 * Need To Notice: When you get the return NULL, means wrong; Remember free memory you get from the return.
007 * How To:
008 * 1.Four parameters: str1, ID, TimeStamp, 3DesKey.
009 3DesKey should be initialied as array,like "unsigned char key[24] ={0x2C, 0x7A, 0x0E, 0x98, 0xF1, 0xE0, 0x76, 0x49, 0x73, 0x15, 0xCD, 0x25, 0xE0, 0xB5, 0x43, 0xCB, 0x0E, 0x80, 0x76, 0x01, 0x7F, 0x23, 0x8A, 0x46};"(I needn't convert them). should not be a string!!
010
011 * Find some memory leaf, Be sure the proccess context is killed!
012 */
013
014 #include
015 #include
016 #include
017 #include
018 #include
019 #include
020 #include
021 #include "encrypt.h"
022 #define MAX_URL_LEN 2048
023 #define DES3_BYTE 8
024 #define DES3_PKCS7
025
026 typedef unsigned char uchar;
027
028 uchar *sha1_encode(uchar *src)
029 {
030 SHA_CTX c;
031 uchar *dest = (uchar *)malloc((SHA_DIGEST_LENGTH + 1)*sizeof(uchar));
032 memset(dest, 0, SHA_DIGEST_LENGTH + 1);
033 if(!SHA1_Init(&c))
034 {
035 free(dest);
036 return NULL;
037 }
038 SHA1_Update(&c, src, strlen(src));
039 SHA1_Final(dest,&c);
040 OPENSSL_cleanse(&c,sizeof(c));
041 return dest;
042 }
043
044 uchar *inter_string(uchar *s1, uchar *s2, uchar *s3)
045 {
046 uchar *dst, *tmp = NULL;
047 int value;
048 size_t len;
049 if(s3 != NULL)
050 {
051 len = strlen(s1) + strlen(s2) + strlen(s3) + 2;
052 #ifdef DES3_PKCS7 //PKCS7補全法,情goolge.確保3DES加密時是8的倍數
053 value = DES3_BYTE - len%DES3_BYTE;
054 if(value != 0)
055 {
056 tmp = (uchar *)malloc((value + 1)*sizeof(uchar));
057 memset(tmp, value, value);
058 memset(tmp + value, 0, 1);
059 }
060 #endif
061 len = (DES3_BYTE - len%DES3_BYTE) + len;
062 dst = (uchar *)malloc((len + 1)*sizeof(uchar));
063 memset(dst, 0, len + 1);
064 strcpy(dst, s1);
065 strcat(dst, "$");
066 strcat(dst, s2);
067 strcat(dst, "$");
068 strcat(dst, s3);
069 if(tmp != NULL)
070 strcat(dst, tmp);
071 free(tmp); //free a pointer to NULL..not a bad thing
072 }
073 else
074 {
075 len = strlen(s1) + strlen(s2) + 1;
076 len = (DES3_BYTE - len%DES3_BYTE) + len;
077 dst = (uchar *)malloc((len + 1)*sizeof(uchar));
078 memset(dst, 0, len + 1);
079 strcpy(dst, s1);
080 strcat(dst, "$");
081 strcat(dst, s2);
082 }
083 fprintf(stderr, "inter_string = %s, //////line = %dn", dst, __LINE__);
084 return dst;
085 }
086
087 int des_encode(uchar *key, uchar *iv, uchar *in, size_t len, uchar **out, int enc)
088 {
089 int ret, i, num;
090 uchar cbc_out[512];
091 uchar key1[8], key2[8], key3[8];
092 des_key_schele ks,ks1,ks2;
093 des_cblock *iv3;
094 /************ugly to get key easily*****************/
095 memset(key1, 0, 8);
096 memset(key2, 0, 8);
097 memset(key3, 0, 8);
098 memcpy(key1, key, 8);
099 memcpy(key2, key + 8, 8);
100 memcpy(key3, key + 16, 8);
101 if ((ret = DES_set_key_checked((const_DES_cblock*)&key1, &ks)) != 0)
102 {
103 fprintf(stderr, "Key1 error %dn",ret);
104 return -1;
105 }
106 if ((ret = DES_set_key_checked((const_DES_cblock*)&key2, &ks1)) != 0)
107 {
108 fprintf(stderr, "Key2 error %dn",ret);
109 return -1;
110 }
111 if ((ret = DES_set_key_checked((const_DES_cblock*)&key3, &ks2)) != 0)
112 {
113 fprintf(stderr, "Key3 error %dn",ret);
114 return -1;
115 }
116 iv3 = (des_cblock *)malloc(strlen(iv)*sizeof(uchar));
117 memset(cbc_out,0,512);
118 memcpy(iv3,iv,strlen(iv));
119 num = len/16;
120 des_ede3_cbc_encrypt(in,cbc_out,len,ks,ks1,ks2,iv3,enc); //cbc演算法
121 memcpy(*out, cbc_out, len);
122 /*
123 for(i = 0; i < num; i++)
124 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),16L,ks,ks1,ks2,iv3,enc);
125 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),len - num*16,ks,ks1,ks2,iv3,enc); //16位加密
126 */
127 for(i=0 ; i < len ; i++)
128 printf(" %02x",cbc_out[i]);
129 printf("n");
130 free(iv3);
131 return 0;
132 }
133 /*======================================================================
134 I dont't know what about base64+sha1
135 we use the sha1-array or a new char * from the sha1-array
136 whatever I do the char charges with ugly code
137 =======================================================================*/
138 uchar *split_byte(uchar *src, size_t len)
139 {
140 int i;
141 uchar tmp, tmp1;
142 uchar *dest = (uchar *)malloc((len + 1)*sizeof(uchar));
143 memset(dest, 0, len + 1);
144 for(i = 0; i < len/2; i++)
145 sprintf(dest + i*2,"%02x",src[i] & 0x000000ff);
146 fprintf(stderr, "function = %s, ////dest = %s, //////line = %dn", __FUNCTION__, dest, __LINE__);
147 }
148
149 uchar *encrypt_JST(uchar *ID, uchar *str1, uchar *TimeStamp, uchar * key, uchar *iv)
150 {
151 int ret, i;
152 size_t len;
153 uchar *sha1, *sha_str, *digest, *digest1, *encrypt;
154 uchar *des3, *src, *url_str, *url;
155 src = inter_string(str1, TimeStamp, NULL);
156 sha1 = sha1_encode(src);
157 if(!sha1)
158 {
159 free(src);
160 return NULL;
161 }
162 len = strlen(sha1);
163 #ifdef CONVERT_T_STR
164 sha_str = split_byte(sha1, len*2);
165 ret = base64_encode_alloc(sha_str, len*2, &digest);
166 #else
167 ret = base64_encode_alloc(sha1, len, &digest);
168 #endif
169 if(!ret)
170 {
171 free(src);
172 free(sha1);
173 #ifdef CONVERT_T_STR
174 free(sha_str);
175 #endif
176 return NULL;
177 encrypt = (uchar *)malloc(len*sizeof(uchar));
178 memset(encrypt, 0, len);
179 if(des_encode(key, iv, des3, len, &encrypt, DES_ENCRYPT))
180 {
181 free(src);
182 free(sha1);
183 #ifdef CONVERT_T_STR
184 free(sha_str);
185 #endif
186 free(des3);
187 free(digest);
188 free(encrypt);
189 return NULL;
190 }
191 ret = base64_encode_alloc(encrypt, len, &digest1);
192 if(!ret)
193 {
194 free(src);
195 free(sha1);
196 #ifdef CONVERT_T_STR
197 free(sha_str);
198 #endif
199 free(des3);
200 free(digest);
201 free(encrypt);
202 return NULL;
203 }
204 fprintf(stderr, "digest1= %s, ////////line = %dn", digest1, __LINE__);
205 url_str = inter_string(ID, digest1, NULL);
206
207 url = (uchar *)malloc(MAX_URL_LEN * sizeof(uchar));
208 url_encode(url_str, url, MAX_URL_LEN - 1);
209 fprintf(stderr, "ur = %s, ///////line = %dn", url, __LINE__);
210 free(src);
211 free(sha1);
212 #ifdef CONVERT_T_STR
213 free(sha_str);
214 #endif
215 free(des3);
216 free(digest);
217 free(encrypt);
218 free(digest1);
219 free(url_str);
220 return url;
221 }

⑩ iOS使用openSSL加密應該怎麼做

使用VS2005下的Visual Studio 2005 Command Prompt進入控制台模式(這個模式會自動設置各種環境變數) 、解壓縮openssl的包,進入openssl的目錄 、perl configure VC-WIN32 盡量在這個目錄下執行該命令,否則找不到Configure文件,或者指定完整的Configure文件路徑。 、ms\do_ms 在解壓目錄下執行ms\do_ms命令 、nmake -f ms\ntdll.mak編譯後在openssl解壓目錄下執行,完成編譯後。輸出的文件在out32dll裡面,包括應用程序的可執行文件、lib文件和dll文件 注意:在運行第五步時,cl編譯器會抱怨說.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推薦的),建議使用_read。呵呵,我可不想將OpenSSL中的所有的read函數修改為_read。再看cl的錯誤代碼 error C2220,於是上MSDN上查找: warning treated as error - no object file generated /WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated. 是由於設置了/WX選項,將所有的警告都作為錯誤對待,所以。。。 於是打開OpenSSL目錄下的MS目錄下的ntdll.mak文件,將CFLAG的/WX選項去掉,存檔。

熱點內容
我的世界好的跑酷伺服器 發布:2025-08-18 02:09:09 瀏覽:741
iis怎麼安裝php 發布:2025-08-18 01:47:58 瀏覽:988
安卓手機如何免費獲得火箭少女 發布:2025-08-18 01:47:51 瀏覽:401
學習如何編程 發布:2025-08-18 01:27:25 瀏覽:111
數據在硬體中的存儲方式 發布:2025-08-18 01:25:56 瀏覽:288
雙擊打開文件夾 發布:2025-08-18 01:25:23 瀏覽:863
php分頁操作 發布:2025-08-18 01:24:26 瀏覽:967
散爆賬號為什麼不能改密碼 發布:2025-08-18 01:23:08 瀏覽:544
雲伺服器正版配置 發布:2025-08-18 01:15:53 瀏覽:425
多點下單腳本 發布:2025-08-18 01:03:45 瀏覽:802