在PHP和IOS中使用openssl加密、解密pdf文件

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文件

由於ios中沒有 cocoa的NSTask 所以要在cocoa touch SDK中執行shell 只能用系統調用

 int system(const char * string);

例如:system("ls");
注意system是系統C函數 所以參數不要使用NSString;
範例:
 #i nclude<stdlib.h>//使用system需要包含此文件
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”);
}


附:


 

system(執行shell 命令)
相關函數
        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 來確認執行成功。
  如果fork()失敗 返回-1:出現錯誤如果exec()失敗,表示不能執行Shell,返回值相當於Shell執行了exit(127)
 
  如果執行成功則返回子Shell的終止狀態
 
  如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string爲空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能爲 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。

附加說明
        在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章