通过ios实现RSA加密和解密
在加密和解密中,我们需要了解的知识有什么事openssl;RSA加密算法的基本原理;如何通过openssl生成最后我们需要的der和p12文件。
废话不多说,直接写步骤:
第一步:openssl来生成公钥和私钥证书,最后需要得到公钥证书和私钥证书
。
这是在mac OX系统下显示的证书,如果我们用文本编辑器打开它,会发现里面是----BEGIN RSA 开头 并且----END RSA 结尾的一串字符串。
第二步:我们需要在代码中写我们的加密和机密方法,加密的字符串通过公钥进行加密,加密后的字符串也可以通过私钥进行解密。
1.在命令行下通过openssl指令获得证书
//生成长度为 1024 的私钥:private_key.pem (文件名可自定义)
openssl genrsa -out private_key.pem //使用私钥文件创建所需的证书:rsaCertReq.csr(文件名可自定义)
openssl req -new -key private_key.pem -out rsaCertReq.csr //使用 x509 创建证书:rsaCert.crt(文件名可自定义)
openssl x509 -req -days -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt //生成 .der 格式的公钥:public_key.der(文件名可自定义)
openssl x509 -outform der -in rsaCert.crt -out public_key.der //生成解密所需 .p12文件:private_key.p12(文件名可自定义)
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
在命令行种可能需要你的一些信息去生成公钥和私钥
Country Name (2 letter code) [AU]:CN // 国家码
State or Province Name (full name) [Some-State]:china //地区码
Locality Name (eg, city) []:wuhan // 本地码
Organization Name (eg, company) [Internet Widgits Pty Ltd]:airway // 公司名称
Organizational Unit Name (eg, section) []:airway // 部门
Common Name (eg, YOUR name) []:airway // 名字
Email Address []: //邮箱
注意:在生成密钥对的时候需要填入 私钥的提取密码,请记住,解密的时候需要用到。
2.我们需要完善我们的代码来实现RSA加密和解密
通过在命令行中的操作,我们最后可以得到我们需要的公钥和私钥文件。
static SecKeyRef _public_key = nil;
// 从公钥证书文件中获取到公钥的SecKeyRef指针: @"public_key" ofType:@"der"
NSString *publicKeyPath = [paramsDict stringValueForKey:@"publicKey" defaultValue:@""];
publicKeyPath = [self getPathWithUZSchemeURL:publicKeyPath];
if (![[NSFileManager defaultManager] fileExistsAtPath:publicKeyPath]) {
[self sendResultEventWithCallbackId:rsaCbId dataDict:@{@"status":[NSNumber numberWithBool:false]} errDict:@{@"code":@(-)} doDelete:NO];
return;
}
NSData *certificateData = [[NSData alloc]initWithContentsOfFile:publicKeyPath];
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); SecKeyRef key = _public_key;
size_t cipherBufferSize = SecKeyGetBlockSize(key);
uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));
NSData *stringBytes = [inString dataUsingEncoding:NSUTF8StringEncoding];
size_t blockSize = cipherBufferSize - ;
size_t blockCount = (size_t)ceil([stringBytes length] / (double)blockSize);
NSMutableData *encryptedData = [[NSMutableData alloc] init];
NSString *outString = [[NSString alloc] init];
for (int i=; i<blockCount; i++) {
int bufferSize = MIN(blockSize,[stringBytes length] - i * blockSize);
NSData *buffer = [stringBytes subdataWithRange:NSMakeRange(i * blockSize, bufferSize)];
OSStatus status = SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes],
[buffer length], cipherBuffer, &cipherBufferSize);
if (status == noErr){
NSData *encryptedBytes = [[NSData alloc] initWithBytes:(const void *)cipherBuffer length:cipherBufferSize];
[encryptedData appendData:encryptedBytes];
} else{
outString = @"";
}
}
if (cipherBuffer) {
free(cipherBuffer);
}
outString = [encryptedData base64Encoding];
}
return outString;
NSString *password = [paramsDict stringValueForKey:@"password" defaultValue:@""];
NSString *inString = [paramsDict stringValueForKey:@"data" defaultValue:@""];
NSString *value = @"";
if (inString.length <= ) {
//err:1
return value;
} else {
// 从私钥证书文件中获取到公钥的SecKeyRef指针: @"private_key" ofType:@"pem"
NSString *privateKeyPath = [paramsDict stringValueForKey:@"privateKey" defaultValue:@""];
privateKeyPath = [self getPathWithUZSchemeURL:privateKeyPath];
if (![[NSFileManager defaultManager] fileExistsAtPath:privateKeyPath]) {
return value;
}
NSData *p12Data = [[NSData alloc]initWithContentsOfFile:privateKeyPath];
SecKeyRef privateKeyRef = NULL;
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:password forKey:(__bridge id)kSecImportExportPassphrase];
CFArrayRef items = CFArrayCreate(NULL, , , NULL);
OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) p12Data, (__bridge CFDictionaryRef)options, &items);
if (securityError == noErr && CFArrayGetCount(items) > ) {
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, );
SecIdentityRef identityApp = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
securityError = SecIdentityCopyPrivateKey(identityApp, &privateKeyRef);
if (securityError != noErr) {
privateKeyRef = NULL;
}
} else {
return value;
}
CFRelease(items); NSData *cipherData = [NSData dataWithBase64EncodedString:inString];
// NSData* decryptData = [self rsaDecryptData: data];
size_t cipherLen = [cipherData length];
void *cipher = malloc(cipherLen);
[cipherData getBytes:cipher length:cipherLen];
size_t plainLen = SecKeyGetBlockSize(privateKeyRef) - ;
void *plain = malloc(plainLen);
OSStatus status = SecKeyDecrypt(privateKeyRef, kSecPaddingPKCS1, cipher, cipherLen, plain, &plainLen);
if (status != noErr) {
return value;
}
NSData *decryptedData = [[NSData alloc] initWithBytes:(const void *)plain length:plainLen];
value = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
NSMutableString *outString = [[NSMutableString alloc] init];
//如果没有进行加密直接解密,outString 将为 nil
if (!value && decryptedData && decryptedData.length > ) {
Byte *datas = (Byte*)[decryptedData bytes];
outString = [NSMutableString stringWithCapacity:decryptedData.length * ];
for(int i = ; i < decryptedData.length; i++){
[outString appendFormat:@"%02x", datas[i]];
}
value = [outString copy];
}
return value;
}
通过ios实现RSA加密和解密的更多相关文章
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- IOS, Android, Java Web Rest : RSA 加密和解密问题
IOS, Android, Java Web Rest : RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...
- C#实现RSA加密和解密详解
原文:C#实现RSA加密和解密详解 RSA加密解密源码: Code highlighting produced by Actipro CodeHighlighter (freeware) http:/ ...
- ASP.NET Core RSA加密或解密
前言 这两天主要是公司同事用到了RSA加密,事后也看了下,以为很简单,最终利用RSACryptoServiceProvider来实现RSA加密,然后大致了解到RSACryptoServiceProvi ...
- C#实现RSA加密与解密、签名与认证(转)
一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...
- RSA加密和解密工具类
import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; i ...
- C#实现RSA加密与解密、签名与认证
一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...
- C# -- RSA加密与解密
1. RSA加密与解密 -- 使用公钥加密.私钥解密 public class RSATool { public string Encrypt(string strText, string st ...
- python RSA加密、解密、签名
python RSA加密.解密.签名 python中用于RSA加解密的库有好久个,本文主要讲解rsa.M2Crypto.Crypto这三个库对于RSA加密.解密.签名.验签的知识点. 知识基础 加密是 ...
随机推荐
- Css-深入学习之弧形切角矩形
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 (弧形切角矩形) 代码: width: 180px; heig ...
- Lua和C++交互详细总结
转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信 ...
- 用php去除bom头
最近在用dede开发一个网站的时候,发现网站在本地没什么问题,但是上传到服务器上面去之后,在首页会默认的生成一串的字符串,如下图所示: 百度了之后,发现好多的解决方法都是说的把文件存储为utf-8无 ...
- BZOJ 3236: [Ahoi2013]作业
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1393 Solved: 562[Submit][Status ...
- ubuntu qtcreator 硬件权限问题
在使用 qtcreator 在 ubuntu(debian.mint 等类同)下做开发时,常用到权限问题,无法直接操作硬件,比如串口等. 办法之一是使用 root 打开 creator,进而进行其他操 ...
- poj 2724 Purifying Machinef
poj 2724 Purifying Machinef 题意 每一个01串中最多含有一个'*','*'既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串.如:000 ...
- Jquery ajax运用执行顺序有误怎么解决
在这儿,可能就要提示一个ajax的一个属性async async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续执行ajax块后 ...
- wpf 获取datagrid中模板中控件
//获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[].GetCellContent(dataGrid.Ite ...
- [译]ASP.NET 5 Configuration
原文:https://docs.asp.net/en/latest/fundamentals/configuration.html ASP.NET 5支持多种配置选项. 应用的配置文件可以是JSON, ...
- CentOS(RedHat)安装Adobe Flash Player插件 For firefox
1. 下载离线包 http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash 如果嫌麻烦,我 ...