ios开发rsa加密,rsa加密算法应用

iOS 非对称加密-RSA

iOS 上 Security.framework 为我们提供了安全方面相关的 API。

成都创新互联公司是一家集网站建设,绥芬河企业网站建设,绥芬河品牌网站建设,网站定制,绥芬河网站建设报价,网络营销,网络优化,绥芬河网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

由于在项目开发中,一般使用服务器提供的密钥对,在本地调试时可使用 openssl 生成

在加密过程之前,我们需要先获取公钥进行存储,这里是通过 .der 文件 加载到 类型为 SecKeyRef 的公钥数据,并进行存储。

将.p12 私钥数据获取,并对其存储。

首先在工程中 引入 openssl ,openssl 是一个开源库,我们可以使用 OpenSSL-Universal ,这个仓库一直在维护,支持 静态库、framework、Cocoapods等等方式引入工程。

IOS中怎么做RSA加密算法

RSA加密以及解密实现步骤:

1、使用openssl生成密匙对。

代码如下:(代码源于github开源社区)

#!/usr/bin/env bash  

echo "Generating RSA key pair ..."  

echo "1024 RSA key: private_key.pem"  

openssl genrsa -out private_key.pem 1024  

echo "create certification require file: rsaCertReq.csr"  

openssl req -new -key private_key.pem -out rsaCertReq.csr  

echo "create certification using x509: rsaCert.crt"  

openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt  

echo "create public_key.der For IOS"  

openssl x509 -outform der -in rsaCert.crt -out public_key.der  

echo "create private_key.p12 For IOS. Please remember your password. The password will be used in iOS."  

openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt  

echo "create rsa_public_key.pem For Java"  

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

echo "create pkcs8_private_key.pem For Java"  

openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt  

echo "finished."

2、加载证书后即可进行加密算法。

代码:

RSAEncryptor *rsa = [[RSAEncryptor alloc] init];  

NSLog(@"encryptor using rsa");  

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"];  

NSLog(@"public key: %@", publicKeyPath);  

[rsa loadPublicKeyFromFile:publicKeyPath];  

NSString *securityText = @"hello ~";  

NSString *encryptedString = [rsa rsaEncryptString:securityText];  

NSLog(@"encrypted data: %@", encryptedString);

对应解密代码:

NSLog(@"decryptor using rsa");  

[rsa loadPrivateKeyFromFile:[[NSBundle mainBundle] pathForResource:@"private_key" ofType:@"p12"] password:@"123456"];  

NSString *decryptedString = [rsa rsaDecryptString:encryptedString];  

NSLog(@"decrypted data: %@", decryptedString);

RSA基本原理:

RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和私钥(private key)。

公钥(public key): 用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端。

私钥(private key): 用于解密数据. 必须保密, 私钥泄露会造成安全问题。

iOS怎么使用模和指数进行RSA加密

首先确认你要加密的数据有多大,如果比较大建议先使用对称算法进行加密,将对称算法的密钥使用RSA加密即可。

现在定义:

你所拿到的公钥模为 N,指数为E

N的位长度为 len(N)

N占用的字节数为 k = (len(N)+7)/8

要加密的数据为D (可以是你原始的数据或者对称算法密钥)

如果你的加密数据比较小的话也可以直接进行RSA加密,比较小的意思为:被加密数据的长度必须能够满足填充条件,如果采用PKCS1_1.5的填充方式,D占用的字节要小于 k-11

运算过程很简单: 将D进行填充到D1, 要求D1所占用的字节数为 k (即同N的长度相同)

则计算密文E的过程为 DE = (D1 ^ E) % N ( ^ 表示指数运算)

在程序中实现建议你采用一些现成的库,如果有OpenSSL则可以网上搜索一下,资料应该不少。

如果没有的话可以直接引入一些大数计算的库直接进行模指运算(别分开,太慢)。

ios开发rsa加密怎么生成秘钥

1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:代码如下: openssl genrsa -out rsa_private_key.pem 1024openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pemopenssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端2、php中用生成的公钥、私钥进行加密解密,直接上代码代码如下: $fp=fopen("rsa/rsa_private_key.pem","r"); //你的私钥文件路径$private_key=fread($fp,8192);fclose($fp);$fp1=fopen("rsa/rsa_public_key.pem","r"); //你的公钥文件路径$public_key=fread($fp1,8192);fclose($fp1);//echo $private_key; $pi_key=openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id $pu_key=openssl_pkey_get_public($public_key );//这个函数可用来判断公钥是否是可用的print_r($pi_key);echo "n"; echo "br";print_r($pu_key);echo "n"; echo "br";echo "hr";$data='php ras加密算法';$encrypted = ""; $decrypted = ""; echo "加密的源数据:".$data."n"; echo "br";echo "private key encrypt:n"; echo "br";openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 echo '私钥加密后:'.$encrypted."n"; echo "br";echo "br";echo "public key decrypt:n"; echo "br";openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来 echo '公钥解密后:'.$decrypted."n"; echo "br";echo "hr";echo "public key encrypt:n"; echo "br";openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密 $encrypted = base64_encode($encrypted); echo $encrypted,"n"; echo "br";echo "private key decrypt:n"; echo "br";openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密 echo $decrypted,"n"; echo "br"; PHP的RSA配置常见问题:●PHP开发语言的代码示例中openssl文件夹中的3个DLL文件用法1、如果你的系统是windows系统,且system32文件目录下没有libeay32.dll、ssleay32.dll这两个文件那么需要拷贝这两个文件到system32文件目录。2、如果您的php安装目录下(phpext)中没有php_openssl.dll那么请把php_openssl.dll放在这个文件夹中喜欢加密解密的小伙伴一定要好好看看这篇文章,受益匪浅。。。

iOS逆向(1)-密码学(RSA)

要讲逆向,那么肯定少不了密码学,因为所有的逆向(攻防)都是对已加密的数据进行解密。所以我们必须初步了解加密的方式有哪些,毕竟知己知彼,才能百战百胜。

接下来,我将从以下四方面来讲述密码学相关的内容:

1、什么是密码学

2、RSA数学原理

3、RSA终端命令

4、总结

密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。

从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。

在1976年以前,所有的加密方法都是同一种模式:加密、解密使用同一种算法。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥),它保护就显得尤其重

要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm)。

1976年,两位美国计算机学家 迪菲(W.Diffie)、赫尔曼( M.Hellman ) 提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”算法。开创了密码学研究的新方向。

1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的名字命名,叫做RSA算法。

也就是说「迪菲赫尔曼密钥交换」在密码学历史的车轮中成为了一个转折点。

咱们这里先把所有需要用到的公式定理列出来:

1、取模运算

2、欧拉函数φ

3、欧拉定理,费马小定理

4、模反元素

5、迪菲赫尔曼密钥交换

取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。

在这列出各种负数情况的例子供大家理解:

7 mod 4 = 3(商 = 1 或 2,12,取商=1)

-7 mod 4 = 1(商 = -1 或 -2,-2-1,取商=-2)

7 mod -4 = -1(商 = -1或-2,-2-1,取商=-2)

-7 mod -4 = -3(商 = 1或2,12,取商=1)

函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负

结论:两个整数求余时,其值的符号为除数的符号。

可以简单理解为:

如果n可以分解为 两个互质(不一定是两个质数) 的数之积A和B,那么:

φ(n) = φ(A) * φ(B)

如果 A和B 又同时为质数,那么:

φ(n) = (A-1) * (B-1)

首先这里说一下,定制之所以是定理是被人证明过的,如何证明的不管,当然你也可以增加去证明下,反正我不管(……%¥%……%……%),哈哈

如果m、n为正整数,且m、n互质,那么:

如果n为质数,那么:

公式转换:

如果两个正整数e和x互质,那么一定可以找到整数d,使得 e*d-1 被x整除。那么d就是e对于x的“模反元素”。

如上图:

客户端持有一个随机数13 ,服务端持有随机数15,再选一对特殊的数,3是17的原根(啥是 原根 ?)。

两端交换的都是密文,就算中间被劫持,也不知道最后需要的传输的内容是10

那么这个10就是最后真正的秘钥。

证明过程

那么:

又由于上面模反元素 最后得出

所以得出最终结论:

这个公式也就是我们最后的RSA加密公式!!!

其中:

补充:

1、n会非常大,长度一般为1024个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位)

2、由于需要求出φ(n),所以根据欧函数特点,最简单的方式n 由两个质数相乘得到: 质数:p1、p2

Φ(n) = (p1 -1) * (p2 - 1)

3、最终由φ(n)得到e 和 d 。

总共生成6个数字:p1、p2、n、φ(n)、e、d

关于RSA的安全:

除了公钥用到了n和e 其余的4个数字是不公开的。

目前破解RSA得到d的方式如下:

1、要想求出私钥 d 。由于e d = φ(n) k + 1。要知道e和φ(n);

2、e是知道的,但是要得到 φ(n),必须知道p1 和 p2。

3、由于 n=p1*p2。只有将n因数分解才能算出。

由于Mac系统内置OpenSSL(开源加密库),所以我们可以直接在终端上使用命令来玩RSA. OpenSSL中RSA算法常用指令主要有三个:

1、由于RSA加密解密用的不是一套数据,所以其保证了安全性。

2、由于私钥过大,所以效率较低

3、如果有一天量子计算机被普及(计算速度极快),那么1024位已经不足以让RSA安全。


名称栏目:ios开发rsa加密,rsa加密算法应用
当前URL:http://azwzsj.com/article/dsohicp.html