首先了解一下幾個相關概念,以方便后面遇到的問題的解決:

RSA算法:1977年由Ron Rivest、Adi Shamirh和LenAdleman發明的,RSA就是取自他們三個人的名字。算法基於一個數論:將兩個大素數相乘非常容易,但要對這個乘積的結果進行 因式分解卻非常困難,因此可以把乘積公開作為公鑰。該算法能夠抵抗目前已知的所有密碼攻擊。RSA算法是一種非對稱算法,算法需要一對密鑰,使用其中一個 加密,需要使用另外一個才能解密。我們在進行RSA加密通訊時,就把公鑰放在客戶端,私鑰留在服務器。

DER, PEM:既然使用RSA需要一對密鑰,那么我們當然是要先使用工具來生成這樣一對密鑰了。在linux、unix下,最簡單方便的就是使用openssl 命令行了。而DER、PEM就是生成的密鑰可選擇的兩種文件格式。DER是Distinguished Encoding Rules的簡稱,是一種信息傳輸語法規則,在ITU X.690中定義的。在ios端,我們的公鑰就是需要這樣一種格式的,我們可以從Certificate, Key, and Trust Services Reference這 篇文檔的SecCertificateCreateWithData函數的data參數的說明中看到。而PEM格式是一種對DER進行封裝的格式,他只是 把der的內容進行了base64編碼並加上了頭尾說明。openssl命令行默認輸出的都是PEM格式的文件,要能夠在ios下使用,我們需要指定使用 DER或者先生成PEM然后轉換稱DER。

使用openssl命令行生成密鑰對

1

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem

按照提示,填入私鑰的密碼,簽名證書的組織名、郵件等信息之后,就會生成包含有公鑰的證書文件public_key.der合私鑰文件 private_key.pem。public_key.der文件用於分發到ios客戶端進行公鑰加解密,而private_key.pem文件留在服 務器端供php使用。當然,如果為了在服務器端進行加解密測試,那么我們還可以生成一個服務器端PHP使用的pem公鑰文件:

1

openssl rsa -in private_key.pem -pubout -out public_key.pem

上面這個命令就會根據輸入的私鑰文件生成pem格式的公鑰文件了。從這里也可以看到,根據私鑰,我們是可以生成相對應的公鑰的,這也就是為什么我們要把公鑰放在客戶端,而不是私鑰放在客戶端的原因了。

服務器端PHP的加解密函數

閑話不多說,貼一段代碼,肯定能看懂的了

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556

class RSAEncryptTest {const PRIVATE_KEY = "-----BEGIN ENCRYPTED PRIVATE KEY-----MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI2aEhi35m/scCAggAMBQGCCqGSIb3DQMHBAihDOZw68gfKwSCAoAu2E/d2a9FgHDWoinhK2nMc2MlrgL+kpWcZ5YyUEWUw87DFKrG7dkpAYOgLIpyDatXUVFy2EekZH0Iplqo+yswtho8NtpJ7T7KJ0nbUXo4we658Ez0EHAnWw+xZegsmJGk2+5QRCALDFyYEIMp3UvqxBjPjfDM1rEZ0j2o9U40ouDqUVxTpq7ZwHkx/EkB8xHwKpFexz8J0s6gjPy6yLUjX2ut63LD6X4YPBQLCJIcaLZORoAQ01cxCaM+78WTLUjdhcaFvff9f1xkiUU3XrQQTpuM/3YHMQ6SMYDAgiOLqSCiMc0VABwf0/kdBnxu9/C/CK82ehA29cVAe8o7HgKg+WszCzTE+QRCJ2fa7nOd7UXzCDfKh5Hhq1RjLFocVK8OW7tIgW3ircltM1ow30FfEzIdvzmvLP0QhfGI3o9VT7r5qihGxtXtnGeUEGwvK0j0ozznfsNej7sVFP0Jfw39TdUlEENhOPjtuBBBHv/oafQ3jqYnrI4R12ZrEU0acm85vRJm32K1RT1ROMFpc5sU20S8nMGCI3iCzUlJPQF0t07bKexayvfWlJVAwEqBBCPTnvfTMBEt33iC72dQELbzMAM/n7thTcY/sReO/J4beGk3//c7PImKIOcIvKF9Gp99l/+BM/LMZ7Thd/qwMOV6Eb3T4BvYItC+P5Lr29XeINmLRHXKwr27uTxX0fwDpmpwkPbGreVXA2cCxHnEzkh2WP3qGa7q+Cwi03ISTEcZbNxLRGArtFUOIvNpz4+FS07OLWVKGl6K6bTffBx1tlZ492SqyNAC7aP4/4I9Malnt0VjRKYPBCkTvVhoWBG+ThoOav5IV+w7ZDy8mtcrcAII-----END ENCRYPTED PRIVATE KEY-----";const PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAqjJs08oHvNdhlWC+kGBd90PD7CVjClhRTk3nn+2NNaP4Bi5N/A18rdrV6clNAGUz4i/5q/VQXeLiGYYqgmAkKCJegReMsfcnoOSWu+Tvxih/48pu1hwBrmMLFZPOOUWQ9YjQEo7SYBe0HKoEl6XMqNwzHV7sk9x6BKz9QeLi5QIDAQAB-----END PUBLIC KEY-----";private static $private_key;private static $public_key;public static function private_encrypt($str){self::setup_key();if(openssl_private_encrypt($str, $encrypted, self::$private_key))return $encrypted;}public static function private_decrypt($str){self::setup_key();if(openssl_private_decrypt($str, $decrypted, self::$private_key))return $decrypted;}public static function public_decrypt($str){self::setup_key();if(openssl_public_decrypt($str, $decrypted, self::$public_key))return $decrypted;}public static function public_encrypt($str){self::setup_key();if(openssl_public_encrypt($str, $encrypted, self::$public_key))return $encrypted;}private static function setup_key(){if (!self::$private_key){// 這里的test就是在生成證書的時候設置的私鑰密碼self::$private_key = openssl_pkey_get_private(self::PRIVATE_KEY, "test");}if (!self::$public_key)self::$public_key = openssl_pkey_get_public(self::PUBLIC_KEY);}}

IOS客戶端的加解密

首先我們需要導入Security.framework,在ios中,我們主要關注四個函數

SecKeyEncrypt:使用公鑰對數據進行加密

SecKeyDecrypt:使用私鑰對數據進行解密

SecKeyRawVerify:使用公鑰對數字簽名和數據進行驗證,以確認該數據的來源合法性。什么是數字簽名,可以參考百度百科這篇文章?

SecKeyRawSign:使用私鑰對數據進行摘要並生成數字簽名

從這幾個函數中,我們可以看到,我們使用公鑰能做的事情就有兩個:加密數據,以及對服務器端發來的數據進行簽名認證,但是如果你想跟我之前想的一 樣,要使用公鑰來對數據進行解密,那就沒有自帶API了。如果想在服務器端使用私鑰加密數據,然后再在客戶端使用公鑰進行解密,以圖這樣來對交互數據進行 加密,看來是行不通的。其實也應該是這樣,公鑰是公開的,因為他可以編譯到二進制文本里面就認為他不能被獲取其實是不對的。同時,RSA因為都是做大數的 運算,算法性能上比較差,如果做大數據量的加解密,對IOS來講,肯定也是不合適的。

這里就把使用公鑰進行加密的代碼貼出來:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960

// 我們在前面使用openssl生成的public_key.der文件的base64值,用你自己的替換掉這里#define RSA_KEY_BASE64 @"MIIC5DCCAk2gAwIBAgIJALUk4hrYth9oMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYDVQQGEwJ\DTjERMA8GA1UECAwIU2hhbmdoYWkxETAPBgNVBAcMCFNoYW5naGFpMQ4wDAYDVQQKDAVCYWl5aTEOMAwGA1UECwwFQmFpeWk\xEDAOBgNVBAMMB1lvcmsuR3UxIzAhBgkqhkiG9w0BCQEWFGd5cTUzMTk5MjBAZ21haWwuY29tMB4XDTExMTAyNjAyNDUzMlo\XDTExMTEyNTAyNDUzM1owgYoxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTERMA8GA1UEBwwIU2hhbmdoYWkxDjA\MBgNVBAoMBUJhaXlpMQ4wDAYDVQQLDAVCYWl5aTEQMA4GA1UEAwwHWW9yay5HdTEjMCEGCSqGSIb3DQEJARYUZ3lxNTMxOTk\yMEBnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAK3cKya7oOi8jVMkRGVuNn/SiSS1y5knKLh6t98JukB\DJZqo30LVPXXL9nHcYXBTulJgzutCOGQxw8ODfAKvXYxmX7QvLwlJRFEzrqzi3eAM2FYtZZeKbgV6PximOwCG6DqaFqd8X0W\ezP1B2eWKz4kLIuSUKOmt0h3RpIPkatPBAgMBAAGjUDBOMB0GA1UdDgQWBBSIiLi2mehEgi/MwRZOld1mLlhl7TAfBgNVHSM\EGDAWgBSIiLi2mehEgi/MwRZOld1mLlhl7TAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAB0GUsssoVEDs9vQxk0\DzNr8pB0idfI+Farl46OZnW5ZwPu3dvSmhQ+yRdh7Ba54JCyvRy0JcWB+fZgO4QorNRbVVbBSuPg6wLzPuasy9TpmaaYaLLK\Iena6Z60aFWRwhazd6+hIsKTMTExaWjndblEbhAsjdpg6QMsKurs9+izr"static SecKeyRef _public_key=nil;+ (SecKeyRef) getPublicKey{ // 從公鑰證書文件中獲取到公鑰的SecKeyRef指針if(_public_key == nil){NSData *certificateData = [Base64 decode:RSA_KEY_BASE64];SecCertificateRef myCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData);SecPolicyRef myPolicy = SecPolicyCreateBasicX509();SecTrustRef myTrust;OSStatus status = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust);SecTrustResultType trustResult;if (status == noErr) {status = SecTrustEvaluate(myTrust, &trustResult);}_public_key = SecTrustCopyPublicKey(myTrust);CFRelease(myCertificate);CFRelease(myPolicy);CFRelease(myTrust);}return _public_key;}+ (NSData*) rsaEncryptString:(NSString*) string{SecKeyRef key = [self getPublicKey];size_t cipherBufferSize = SecKeyGetBlockSize(key);uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding];size_t blockSize = cipherBufferSize - 11;size_t blockCount = (size_t)ceil([stringBytes length] / (double)blockSize);NSMutableData *encryptedData = [[[NSMutableData alloc] init] autorelease];for (int i=0; i

linux安装php7 nagnx,iOS下使用rsa算法與php進行加解密通訊相关推荐

  1. ios下使用rsa算法与php进行加解密通讯

    首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数 ...

  2. Linux安装php-7.0.16,完成php和apache的配置

    Linux安装php-7.0.16,完成php和apache的配置     版本:php-7.0.16.tar.gz,libxml2-2.9.2.tar.gz(php需要它的支持,首先安装它) 说明 ...

  3. CentOS 7 Linux 安装PHP7.2.12 - 编译安装

    CentOS 7 Linux 安装PHP7.2 - 编译安装 1 安装扩展包并更新系统内核 [root@iz28snxdn5mz ~]# yum install epel-release -y [ro ...

  4. linux php7扩展查看,linux安装PHP7以及扩展

    Linux下安装PHP7 事先升级gcc4.8,然后安装PHP7,安装步骤参考:CentOS安装PHP7 1.Linux下编译的php没有php.ini 解决办法:从源代码目录中复制php.ini-d ...

  5. linux安装meb工具,linux-docker下安装禅道全部

    友情提示:按照步骤走,99%的人会安装成功,1%的人可以咨询度娘 64位电脑安装禅道,满足发送邮件功能 第一步: docker ps 查看docker中的容器是否有禅道(docker ps -a    ...

  6. Linux安装配置类似mac下的docky

    百度经验:ubuntu安装配置类似mac下的docky 亲手打造自己的Linux桌面环境:http://os.51cto.com/art/201510/493896_all.htm Dock是一种图形 ...

  7. Linux安装nextcloud教程,CentOS7下NextCloud搭建

    搭建前准备工作:关闭selinux,关闭防火墙 一. LAMP环境搭建 1.Apache搭建 yum install httpd –y 开启apache服务,设为开机自启 systemctl star ...

  8. linux 安装php7.1

    http://www.jb51.net/article/83466.htm PHP(超文本预处理器)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于W ...

  9. 【 Linux学习】Linux环境下利用OpenSSL对大文件进行AES加解密

    一.背景 之前的几篇博客已经介绍了Gitlab如何备份恢复与迁移已经脚本监控过程等. git学习--> Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyan ...

最新文章

  1. WinCE中断结构分析
  2. 成功解决ValueError: DataFrame.dtypes for data must be int, float or bool.Did not expect the data types
  3. python的基本原理_Python函数基本使用原理详解
  4. attachment delete deletion commit work issue
  5. python3 xlsxwiter模块插入matplotlib保存到io.BytesIO中的图
  6. 新入职了一个卷王,天天加班12点!张口闭口就是性能优化,太让人崩溃……...
  7. 打通版微社区(5):部署DZ3.2
  8. Ansible复制文件copy和执行脚本shell(学习笔记二)
  9. linux 桌面时间,桌面锁屏时钟下载-桌面锁屏时钟appv2.8.1-Linux公社
  10. 使用mutt和msmtp发送邮件
  11. Et aliquam sunt quasi harum unde.Deserunt impediSofort wohnen früh aus t quidem vel dolorum ducimus.
  12. centos7设置Java服务开机自启
  13. 小虎电商浏览器:拼多多怎么看单品实时数据
  14. python 乒乓球_python使用pygame实现笑脸乒乓球弹珠球游戏
  15. 从奶茶品牌【茶颜悦色】看互联网的品牌保护
  16. 基于VC++6.0开发俄罗斯方块(五)
  17. STD: Sparse-to-Dense 3D Object Detector for Point Cloud 阅读笔记
  18. 解密 富士白光HAKKO触摸屏上传密码解密
  19. 62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能
  20. MDK5注释乱码以及解决方案

热门文章

  1. QT creator使用(五):应用程序主窗口QMainWindow
  2. Postgres -- 如何理解 select into 如何将查询结果自动生成到一张新表当中
  3. python发信息给微信群_利用Python转发微信群通知信息
  4. 关于 mybatis 中写法
  5. php js写法,javaScript封装的各种写法
  6. 第10章第25节:使用Paper Cut Art Generator创建剪纸艺术图像 [PowerPoint精美幻灯片实战教程]
  7. IE7.0使用技巧30招
  8. 【转载】“而立”,“不惑”和“知天命”--程序员的三个层次
  9. 【Linux命令】查找文件命令
  10. Matlab画图乘号误区