网站响应时间 标准,做vi设计的国外网站,重庆网站建设大概多少费用,源码网站推荐首先了解一下几个相关概念#xff0c;以方便后面遇到的问题的解决#xff1a;RSA算法#xff1a;1977年由Ron Rivest、Adi Shamirh和LenAdleman发明的#xff0c;RSA就是取自他们三个人的名字。算法基于一个数论#xff1a;将两个大素数相乘非常容易#xff0c;但要对这个… 首先了解一下几个相关概念以方便后面遇到的问题的解决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命令行生成密钥对1openssl 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公钥文件1openssl rsa -inprivate_key.pem -pubout -out public_key.pem上面这个命令就会根据输入的私钥文件生成pem格式的公钥文件了。从这里也可以看到根据私钥我们是可以生成相对应的公钥的这也就是为什么我们要把公钥放在客户端而不是私钥放在客户端的原因了。服务器端PHP的加解密函数闲话不多说贴一段代码肯定能看懂的了1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556classRSAEncryptTest {constPRIVATE_KEY -----BEGIN ENCRYPTED PRIVATE KEY-----MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI2aEhi35m/scCAggAMBQGCCqGSIb3DQMHBAihDOZw68gfKwSCAoAu2E/d2a9FgHDWoinhK2nMc2MlrgLkpWcZ5YyUEWUw87DFKrG7dkpAYOgLIpyDatXUVFy2EekZH0Iplqoyswtho8NtpJ7T7KJ0nbUXo4we658Ez0EHAnWwxZegsmJGk25QRCALDFyYEIMp3UvqxBjPjfDM1rEZ0j2o9U40ouDqUVxTpq7ZwHkx/EkB8xHwKpFexz8J0s6gjPy6yLUjX2ut63LD6X4YPBQLCJIcaLZORoAQ01cxCaM78WTLUjdhcaFvff9f1xkiUU3XrQQTpuM/3YHMQ6SMYDAgiOLqSCiMc0VABwf0/kdBnxu9/C/CK82ehA29cVAe8o7HgKgWszCzTEQRCJ2fa7nOd7UXzCDfKh5Hhq1RjLFocVK8OW7tIgW3ircltM1ow30FfEzIdvzmvLP0QhfGI3o9VT7r5qihGxtXtnGeUEGwvK0j0ozznfsNej7sVFP0Jfw39TdUlEENhOPjtuBBBHv/oafQ3jqYnrI4R12ZrEU0acm85vRJm32K1RT1ROMFpc5sU20S8nMGCI3iCzUlJPQF0t07bKexayvfWlJVAwEqBBCPTnvfTMBEt33iC72dQELbzMAM/n7thTcY/sReO/J4beGk3//c7PImKIOcIvKF9Gp99l/BM/LMZ7Thd/qwMOV6Eb3T4BvYItCP5Lr29XeINmLRHXKwr27uTxX0fwDpmpwkPbGreVXA2cCxHnEzkh2WP3qGa7qCwi03ISTEcZbNxLRGArtFUOIvNpz4FS07OLWVKGl6K6bTffBx1tlZ492SqyNAC7aP4/4I9Malnt0VjRKYPBCkTvVhoWBGThoOav5IVw7ZDy8mtcrcAII-----ENDENCRYPTED PRIVATE KEY-----;constPUBLIC_KEY -----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAqjJs08oHvNdhlWCkGBd90PD7CVjClhRTk3nn2NNaP4Bi5N/A18rdrV6clNAGUz4i/5q/VQXeLiGYYqgmAkKCJegReMsfcnoOSWuTvxih/48pu1hwBrmMLFZPOOUWQ9YjQEo7SYBe0HKoEl6XMqNwzHV7sk9x6BKz9QeLi5QIDAQAB-----ENDPUBLIC KEY-----;privatestatic$private_key;privatestatic$public_key;publicstaticfunctionprivate_encrypt($str){self::setup_key();if(openssl_private_encrypt($str, $encrypted, self::$private_key))return$encrypted;}publicstaticfunctionprivate_decrypt($str){self::setup_key();if(openssl_private_decrypt($str, $decrypted, self::$private_key))return$decrypted;}publicstaticfunctionpublic_decrypt($str){self::setup_key();if(openssl_public_decrypt($str, $decrypted, self::$public_key))return$decrypted;}publicstaticfunctionpublic_encrypt($str){self::setup_key();if(openssl_public_encrypt($str, $encrypted, self::$public_key))return$encrypted;}privatestaticfunctionsetup_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\DzNr8pB0idfIFarl46OZnW5ZwPu3dvSmhQyRdh7Ba54JCyvRy0JcWBfZgO4QorNRbVVbBSuPg6wLzPuasy9TpmaaYaLLK\Iena6Z60aFWRwhazd6hIsKTMTExaWjndblEbhAsjdpg6QMsKurs9izrstaticSecKeyRef_public_keynil; (SecKeyRef) getPublicKey{ // 从公钥证书文件中获取到公钥的SecKeyRef指针if(_public_key nil){NSData*certificateData [Base64 decode:RSA_KEY_BASE64];SecCertificateRefmyCertificate SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData);SecPolicyRefmyPolicy SecPolicyCreateBasicX509();SecTrustRefmyTrust;OSStatusstatus 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{SecKeyRefkey [selfgetPublicKey];size_tcipherBufferSize SecKeyGetBlockSize(key);uint8_t*cipherBuffer malloc(cipherBufferSize * sizeof(uint8_t));NSData*stringBytes [string dataUsingEncoding:NSUTF8StringEncoding];size_tblockSize cipherBufferSize - 11;size_tblockCount (size_t)ceil([stringBytes length] / (double)blockSize);NSMutableData*encryptedData [[[NSMutableDataalloc] init] autorelease];for(inti0; iblockCount; i) {intbufferSize MIN(blockSize,[stringBytes length] - i * blockSize);NSData*buffer [stringBytes subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];OSStatusstatus SecKeyEncrypt(key, kSecPaddingPKCS1, (constuint8_t*)[buffer bytes],[buffer length], cipherBuffer, cipherBufferSize);if(status noErr){NSData*encryptedBytes [[NSDataalloc] initWithBytes:(constvoid*)cipherBuffer length:cipherBufferSize];[encryptedData appendData:encryptedBytes];[encryptedBytes release];}else{if(cipherBuffer) free(cipherBuffer);returnnil;}}if(cipherBuffer) free(cipherBuffer);// NSLog(Encrypted text (%d bytes): %, [encryptedData length], [encryptedData description]);// NSLog(Encrypted text base64: %, [Base64 encode:encryptedData]);returnencryptedData;}http://blog.yorkgu.me/2011/10/27/rsa-in-ios-using-publick-key-generated-by-openssl/ 转载于:https://blog.51cto.com/techforlcl/1323131