惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - toon的泥瓦匠

在oj中Python的循环输入问题解决 LeetCode 2. Add Two Numbers swift LeetCode 01 Two Sum swift Protocol in Objective-C 阿里云Center OS 6.2 Nginx 配置 SSL/TLS HTTPS配置 阿里云Centos 6.3 64位 安全加固版 升级 Php 中的 Curl 7.19 到 7.35 iOS APNS配置(转) GCD dispath_async dispath_sync 各种混合使用测试情况 Mac OS X Redmine Backlogs安装日志 设计模式建议学习顺序 调试iOS 已经发布代码 Crash 文件分析出出错对应代码 xcode调试找出错误行 iOS 日期格式串 setDateFormat 显示格式代码 iOS5 UI 设计新手段 Storyboard UIEdgeInsets Non-SQL 完成公司核名 varchar(max) text sqlserver 2005 数据库的正则替换 sqlserver 2005 full-text 的创建和使用 - toon的泥瓦匠
iOS RSA公钥加密数据 服务端接受PHP私钥解密 反过服务端公钥加密数据 iOS端私钥解密数据
toon的泥瓦匠 · 2012-10-30 · via 博客园 - toon的泥瓦匠

加密传输的数据,采用RSA算法,RSA是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密。有可私钥可以直接生产公钥。

 iOS SDK并不支持私钥加密,公钥解密。可以通过OPENSSL第三方库解决。 

使用openssl命令行生成密钥对

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公钥文件:

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

上面这个命令就会根据输入的私钥文件生成pem格式的公钥文件了。从这里也可以看到,根据私钥,我们是可以生成相对应的公钥的,这也就是为什么我们要把公钥放在客户端,而不是私钥放在客户端的原因了。

服务器端PHP的加解密测试代码

 <?php

class RSAEncryptTest {
  const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,C222ABDFB89D4349

qStrPtGxMrB24Q/yHwNhVpq5CjPKThCTPRnicXWYm1mAxBG2iR5T5E05pROzsPur
YhFr+PUb+C6WI9pYLYbqax1k59CZG63YP2SLAvYftgSaAjmvuZzlvMnBXA/yqioL
Fab1f4vNavZTBiOrXFsO7ryygAJub9GLx2GEr/RoJgnvHbqz2yknF0EmylsWA1LM
8EypQZQC9eg40W0khhTYgfc488jdam3hCsFvGiELDb/NBEryRa1adVIaREpSbA24
tP2/NQYjW45M+g1PFDqeDRGmPNjeH3z6T1fIbiJIFu2d7SsMUT2PZhFbllapL9nD
jL4x4MfLb00lstvmTNAqK75pIkuEUKr9t+v4hzZjgWW45QNtMGVFHJj36gZzvhdV
YOQP0fk57/UrnDlBijKFyuK7FC/rhyH2IZ+oLfWlBcRnlaPZC3UTrOxyxgJnc5JL
wpdz/bF4beUh8e9paR0liywrNKGIkIvCnGqwPlnaqHW225uKObU6MFcL58cQ8Cx1
3NQ0ulJnUGgWIScC3oYRR+r7atXNbdYkK16dmcav9ay4d2nJ/a2qY/sbgXzjPJve
8eX3oHnQvtyfhUAzVasLelBDoNexNlsAqgIbSYAo0hIm2FtZ0Y+WGAzgMU2G9O0i
NAU8zv8xXExMnMslCFVVIfFCA/cM84Z5t5NYnJchpOYomtvaaApLuKjDQhsIFi+1
W/RvPWOxuhbJkzFPmLuZy2KtcdPTMceJ8qDYeNSgzLZ1RZgj2EvRVGyBHUJrocrv
LZTsUTkkBCeQoCbcKKstwSDpl9mlAMro8b78elIAPYkxgZpD/EjOOw==
-----END RSA PRIVATE KEY-----
";
  const PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXZaD7aXaL6WOGFqfu8M1C55z2
d8gylu2y6jRdyc9wPt14tmkKofJE9vosD4mCRAArw0yS633g0b0Ln9f1IVFg2ZE1
5kBASpQf42D08Jb/L93GHPBUhvFBUy8pUAKwqa6braW/4ZMNj40f5PGhqkyH0VIV
03aeS8yd1lPPMtX1XwIDAQAB
-----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, "1234");
    }
    if (!self::$public_key)
      self::$public_key = openssl_pkey_get_public(self::PUBLIC_KEY);
  }
}
//公钥加密字符串 xxx
$public_encrypt=RSAEncryptTest::public_encrypt("xxx");
echo  "public_encrypt:\n";
echo  base64_encode($private_encrypt) ;
echo  "\n";

//私钥解密
$private_decrypt=RSAEncryptTest::private_decrypt($public_encrypt);

echo "private_decrypt:\n";

echo$private_decrypt;

echo "\n";

iOS端

参考链接:

http://blog.yorkgu.me/2011/10/27/rsa-in-ios-using-publick-key-generated-by-openssl/