在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//使用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
定义函数
        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()会继承环境变量,通过环境变量可能会造成系统安全的问题。

 


你可能感兴趣的:(加密,openssl,解密文件)