怎么做网站架构图,自己做的网站手机不能看,网站开发人员选项,网站开发项目流程设计背景 RSA这种非对称加密被广泛的运用于网络数据的传输#xff0c;但其在iOS上很难直接实现#xff0c;BBRSACryptor框架通过移植openssl实现了iOS端的RSA#xff0c;本文将介绍如何使用BBRSACryptor生成证书#xff0c;加载公钥#xff0c;以及后端如何用php读取证书… 背景 RSA这种非对称加密被广泛的运用于网络数据的传输但其在iOS上很难直接实现BBRSACryptor框架通过移植openssl实现了iOS端的RSA本文将介绍如何使用BBRSACryptor生成证书加载公钥以及后端如何用php读取证书加载私钥。 iOS加密 新建工程并集成BBRSACryptor 这个框架自带的demo将工程文件与框架放在了同一目录因此在配置Header Search Paths时没有包含工程文件夹一定注意下面新建的工程将框架放在了工程文件夹内因此头文件寻找路径需要包含上工程目录。详细步骤如下。  1. 新建一个iOS工程将BBRSACryptor、GTMBase64、OpenSSL三个文件夹拖入工程目录结构如下。  2.在Build Settings中配置Header Search Pathes。 注意最前面的文件夹名称要和自己的工程名相同 3.打开BBRSACryptor.m文件修改存储证书的目录和文件路径默认的是隐藏目录前加点为了方便查看与复制证书建议将路径前面的点去掉例如 #define OpenSSLRSAKeyDir [DocumentsDir stringByAppendingPathComponent:openssl_rsa]
#define OpenSSLRSAPublicKeyFile [OpenSSLRSAKeyDir stringByAppendingPathComponent:publicKey.pem]
#define OpenSSLRSAPrivateKeyFile [OpenSSLRSAKeyDir stringByAppendingPathComponent:privateKey.pem] 4.打开ViewController.m导入BBRSACryptor.h和GTMBase64.h使用下面的代码生成证书。 BBRSACryptor *rsaCryptor  [[BBRSACryptor alloc] init];
[rsaCryptor generateRSAKeyPairWithKeySize:1024]; 运行后在控制台会打印出证书路径进入路径后可以看到公钥和私钥证书。  5.使用TextEdit打开公钥证书将—–BEGIN PUBLIC KEY—–和—–END PUBLIC KEY—–之间的部分复制然后在工程中新建一个宏来保存这个公钥以便后续读取。 #define PublicKey \
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjYyZoASYgTMIc/5YkSJngRbNYEQEI3UF7RVijF0STcMs93pH0qhjLJIQnsvUn2ghEVM4XStQ0XhS7tmL1UMEFgDgYwG/xr/ZjUozgQyvqeUejA08pbun0E0/Yx9WuBQfCpCc5vNka/ENDZEy/2PbEO5KD3hgsnH1JyNqNnwIDAQAB 客户端仅保存公钥即可私钥放在服务器上。使用php可以直接读取证书。 6.在客户端加载公钥与进行加密  前面已经创建了宏以后通过宏即可加载公钥。如下 BBRSACryptor *rsaCryptor  [[BBRSACryptor alloc] init];
// PublicKey是从公钥证书中复制的内容创建的宏见上文。
[rsaCryptor importRSAPublicKeyBase64:PublicKey];
NSData *data  [rsaCryptor encryptWithPublicKeyUsingPadding:RSA_PADDING_TYPE_PKCS1 plainData:[客户端加密的内容 dataUsingEncoding:NSUTF8StringEncoding]];
NSString *baseStr  [GTMBase64 stringByEncodingData:data];
NSLog(%,baseStr); 先加载公钥然后把要加密的内容转换成NSData加密后的内容先进行base64编码后再传输。为了验证能够解密最后对base64编码的加密内容进行了打印将这个内容先复制到剪贴板后面贴在php中进行解密。 php解密 为了方便将按照上文方法生成的私钥证书复制到服务器的某个目录并在这个目录下创建一个php文件并添加如下代码 ?phpheader(Content-type:text/html; charsetutf-8);/*** 密钥文件的路径*/$privateKeyFilePath  privateKey.pem;/*** 公钥文件的路径*/$publicKeyFilePath  publicKey.pem;extension_loaded(openssl) or die(php需要openssl扩展支持);(file_exists($privateKeyFilePath)  file_exists($publicKeyFilePath))or die(密钥或者公钥的文件路径不正确);/*** 生成Resource类型的密钥如果密钥文件内容被破坏openssl_pkey_get_private函数返回false*/$privateKey  openssl_pkey_get_private(file_get_contents($privateKeyFilePath));/*** 生成Resource类型的公钥如果公钥文件内容被破坏openssl_pkey_get_public函数返回false*/$publicKey  openssl_pkey_get_public(file_get_contents($publicKeyFilePath));($privateKey  $publicKey) or die(密钥或者公钥不可用);// 这段内容来自上面iOS端打印的加密内容的base64编码$encryptData  J0oTqBCNbsJauVwRz380y519sSa7ficUO1NvRKiMGKUGJF0pomOu20fHqC77NmsKle9/L4DyYNr3xDgDa4SpO0in39rA9EYXzmx3rlyI1c8iPjAkQ6XpwZk7BsThiCFB/6QmkTW5pMIo4b0axRv/4lq1Rqx/YtuIsGkXQTNntI;$ee  base64_decode($encryptData);$decryptData ;if (openssl_private_decrypt($ee, $decryptData, $privateKey)) {echo 解密成功解密后数据为:, $decryptData, PHP_EOL;} else {die(解密成功);}
? 访问这个脚本如果前面做的没有问题会得到解密的结果  php加密 使用私钥加密后可以在客户端利用公钥解密。使用下面的代码进行加密。 ?phpheader(Content-type:text/html; charsetutf-8);/*** 密钥文件的路径*/$privateKeyFilePath  privateKey.pem;/*** 公钥文件的路径*/$publicKeyFilePath  publicKey.pem;extension_loaded(openssl) or die(php需要openssl扩展支持);(file_exists($privateKeyFilePath)  file_exists($publicKeyFilePath))or die(密钥或者公钥的文件路径不正确);/*** 生成Resource类型的密钥如果密钥文件内容被破坏openssl_pkey_get_private函数返回false*/$privateKey  openssl_pkey_get_private(file_get_contents($privateKeyFilePath));/*** 生成Resource类型的公钥如果公钥文件内容被破坏openssl_pkey_get_public函数返回false*/$publicKey  openssl_pkey_get_public(file_get_contents($publicKeyFilePath));($privateKey  $publicKey) or die(密钥或者公钥不可用);
$originalData  服务器加密的内容;/*** 加密以后的数据用于在网路上传输*/$encryptData  ;echo 原数据为:, $originalData, PHP_EOL;///用私钥加密if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {echo 加密成功加密后数据(base64_encode后)为:, base64_encode($encryptData), PHP_EOL;} else {  die(加密失败);  }
? 访问脚本后会打印出加密的base64编码将这个编码复制到客户端进行解密来验证可用性。 iOS解密 要在iOS端解密和加密类似先加载公钥然后把base64编码的加密内容解码解密后转为NSString即可。 BBRSACryptor *rsaCryptor  [[BBRSACryptor alloc] init];
[rsaCryptor importRSAPublicKeyBase64:PublicKey];
NSData *enCryptorDataBase64  [aWdbPQHiQzU5CUOAIGQT3OD/MPqcqoXHXDFtYQPVRo9/Mb1S/aVcKQVHDjBpLgfzw0mWxgHN6SuOfH8z9WobgQrTZhpxhau3DnfukLmENGPWVMqquWMxTkEU7yCkx/RI7XEwv3jk9d4UgFOv35eqNUgYyWDq2gGatEpfnUg6U dataUsingEncoding:NSUTF8StringEncoding];
NSData *deCryptorData  [rsaCryptor decryptWithPublicKeyUsingPadding:RSA_PADDING_TYPE_PKCS1 cipherData:[GTMBase64 decodeData:enCryptorDataBase64]];
NSLog(%,[[NSString alloc] initWithData:deCryptorData encoding:NSUTF8StringEncoding]); 不出意外的话控制台将会打印出解密后的内容。 转载于:https://www.cnblogs.com/aiwz/p/6154011.html