1.什麼是openssl?
openSSL 不僅僅是 SSL。它可以實現消息摘要、文件的加密和解密、數字證書、數字簽名和隨機數字。關於 OpenSSL 庫的內容非常多,遠不是一篇文章可以容納的。
OpenSSL 不只是 API,它還是一個命令行工具。命令行工具可以完成與 API 同樣的工作,而且更進一步,可以測試 SSL 服務器和客戶機。
2.openssl enc 用法:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]
[-d] [-a] [-k password] [-kfile filename] [-K key] [-iv IV] [-p]
[-P] [-bufsize number] [-debug]
說明:
對稱加密算法工具。它能夠把數據用不同對稱加密算法來加/解密。還能夠把加密
/接密,還可以把結果進行base64編碼。
OPTIONS
-in filename
要加密/解密的輸入文件,缺省爲標準輸入。
-out filename
要加密/解密的輸出文件,缺省爲標準輸出。
-pass arg
輸入文件如果有密碼保護,在這裏輸入密碼。
-salt
爲了和openssl0.9.5以後的版本兼容,必須set這個option.salt大概又是密碼學裏
的一個術語,具體是做什麼的我也沒弄的很明白。就我的理解,這是加密過後放在
密碼最前面的一段字符串, 用途也是爲了讓破解更難.如果理解錯了,請密碼學高手
指正.
-nosalt
想和openssl0.9.5以前的版本兼容,就set這個option
-e
一個缺省會set的option, 把輸入數據加密。
-d
解密輸入數據。
-a
用base64編碼處理數據。set了這個option表示在加密之後的數據還要用
base64編碼捏一次,解密之前則先用base64編碼解碼。
-k password
一個過時了的項,爲了和以前版本兼容。現在用-key代替了。
-kfile filename
同上,被passin代替。
-K key
以16進製表示的密碼。
-iv IV
作用完全同上。
-p
打印出使用的密碼。
-P
作用同上,但打印完之後馬上退出。
-bufsize number
設置I/O操作的緩衝區大小
-debug
打印調試信息。
3.在PHP中使用openssl enc加密pdf文件:
//產生16byte的-k和-iv
for( $i = 0 ; $i < 8 ; $i ++ )
{
$pdfkey.= sprintf("%04X",substr($deviceid,$i,$i+1));
//1位變爲4位16進制數}
$encrypy_cmd = "openssl enc -in $src2file -out $descfile -e -aes128 -salt -K $pdfkey -iv $pdfkey -nopad" ;
exec( $encrypy_cmd );
4.在PHP中使用openssl enc解密pdf文件
$encrypy_cmd1 = "openssl enc -in $descfile -out $descfile1 -d -aes128 -salt -K $pdfkey -iv $pdfkey -nopad" ;
exec( $encrypy_cmd1 );
5.在ios中使用openssl enc解密pdf文件
int system(const char * string);
main()
{
system("openssl enc -in /var/www/symbian1/interface/nreader2/tmp/temp-enc1351760437.92931423.pdf -out /var/www/symbian1/interface/nreader2/tmp/temp-pdf1351760437.92931423.pdf -d -aes128 -salt -K 0000000C00EA0D80B26EDDD51A850315 -iv 0000000C00EA0D80B26EDDD51A850315 -nopad”);
附:
相關函數
fork,execve,waitpid,popen
表頭文件
#i nclude<stdlib.h>
定義函數
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現錯誤
=0:調用成功但是沒有出現子進程
>0:成功退出的子進程的id
如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string爲空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能爲 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。