iOS rsa加密与解密

转自 --响铃  IOS rsa加密与解密

ras加密需要两组秘钥,一组公共秘钥,一组私有秘钥。

生成命令:

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:2048 -keyout private_key.pem

public_key.der为公共秘钥文件,private_key.pem为私有秘钥文件。

生成ios可引用的私有秘钥文件.pfx:

1. OpenSSL rsa -in private_key.pem -out private_key.key

2. OpenSSL req -new -key private_key.key -out private_key.crt

3. OpenSSL x509 -req -days 3650 -in private_key.crt -signkey private_key.key -out rsaCert.crt

4. OpenSSL x509 -outform der -in rsaCert.crt -out rsaCert.der

5. OpenSSL pkcs12 -export -out private_key.pfx -inkey private_key.key -in rsaCert.crt

private_key.pfx即为生成的文件

公共秘钥的引用:

- (SecKeyRef)getPublicKey

{

SecCertificateRef myCertificate = nil;

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

NSData *certificateData = [NSData dataWithContentsOfFile:path];

myCertificate = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridgeCFDataRef)certificateData);

SecPolicyRef myPolicy = SecPolicyCreateBasicX509();

SecTrustRef myTrust;

OSStatus status = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust);

SecTrustResultType trustResult;

if (status == noErr) {

status = SecTrustEvaluate(myTrust, &trustResult);

}

return SecTrustCopyPublicKey(myTrust);

}

私有秘钥的引用

- (SecKeyRef)getPrivateKey

{

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"private_key"ofType:@"pfx"];

NSData *pfxkeyData = [[NSData alloc]initWithContentsOfFile:publicKeyPath];

NSMutableDictionary * options = [[NSMutableDictionary alloc] init];

[options setObject:@"password" forKey:(__bridge id)kSecImportExportPassphrase];

CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);

OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) pfxkeyData,

(__bridge CFDictionaryRef)options, &items);

CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);

SecIdentityRef identityApp =

(SecIdentityRef)CFDictionaryGetValue(identityDict,

kSecImportItemIdentity);

assert(securityError == noErr);

SecKeyRef privateKeyRef;

SecIdentityCopyPrivateKey(identityApp, &privateKeyRef);

return privateKeyRef;

}

公钥加密:

- (NSData*)rsaEncryptWithData:(NSData*)data usingKey:(SecKeyRef)key{

size_t cipherBufferSize = SecKeyGetBlockSize(key);

uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t));

memset((void *)cipherBuffer, 0*0, cipherBufferSize);

NSData *plainTextBytes = data;

size_t blockSize = cipherBufferSize - 11;

size_t blockCount = (size_t)ceil([plainTextBytes length] / (double)blockSize);

NSMutableData *encryptedData = [NSMutableData dataWithCapacity:0];

for (int i=0; i<blockCount; i++) {

int bufferSize = MIN(blockSize,[plainTextBytes length] - i * blockSize);

NSData *buffer = [plainTextBytes 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 dataWithBytes:(const void *)cipherBuffer length:cipherBufferSize];

[encryptedData appendData:encryptedBytes];

}else{

if (cipherBuffer) {

free(cipherBuffer);

}

return nil;

}

}

if (cipherBuffer) free(cipherBuffer);

return encryptedData;

}

私钥解密:

- (NSData*)rsaDecryptWithData:(NSData*)data usingKey:(SecKeyRef)key{

NSData *wrappedSymmetricKey = data;

size_t cipherBufferSize = SecKeyGetBlockSize(key);

size_t keyBufferSize = [wrappedSymmetricKey length];

NSMutableData *bits = [NSMutableData dataWithLength:keyBufferSize];

OSStatus sanityCheck = SecKeyDecrypt(key,

kSecPaddingPKCS1,

(const uint8_t *) [wrappedSymmetricKey bytes],

cipherBufferSize,

[bits mutableBytes],

&keyBufferSize);

NSAssert(sanityCheck == noErr, @"Error decrypting, OSStatus == %ld.", sanityCheck);

[bits setLength:keyBufferSize];

return bits;

}

加密解密网上有写好的ras.m,可以参考:

http://code4app.com/ios/RSA-Encrypt-and-Decrypt/5061d6476803faf86c000001

时间: 2024-12-19 13:38:58

iOS rsa加密与解密的相关文章

ios RSA加密解密一些相关问题

前言: 最近在做一个类似支付宝的理财项目,涉及到了RSA加解密方面的知识,在这里也遇到了不少的问题.写出来与大家分享心得. 1.什么是RSA加密解密(ios RSA加密解密过程) 这些网上都说的很清楚,大家可以从网上查找一下. 理论上是可以用公钥加密,私钥解密,或者是私钥加密,公钥解密. 我的理解是:A向B请求数据:A把自己的信息用私钥签名,并且把自己的公钥传送给B, B受到A的数据:B将A的公钥取出,并且用A的公钥确认签名, B向A发送数据:B将自己的数据用A公钥加密,再将自己的公钥暴露给A,

通过ios实现RSA加密和解密

在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成公钥和私钥证书,最后需要得到公钥证书和私钥证书 . 这是在mac OX系统下显示的证书,如果我们用文本编辑器打开它,会发现里面是----BEGIN RSA 开头  并且----END RSA 结尾的一串字符串. 第二步:我们需要在代码中写我们的加密和机密方法,加密的字符串通过公钥进行加密,加密后的字

C#实现RSA加密和解密详解

原文:C#实现RSA加密和解密详解 RSA加密解密源码: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography;

RSA加密和解密工具类

1 import org.apache.commons.codec.binary.Base64; 2 3 import javax.crypto.Cipher; 4 import java.security.*; 5 import java.security.spec.PKCS8EncodedKeySpec; 6 import java.security.spec.X509EncodedKeySpec; 7 import java.util.HashMap; 8 import java.util

IOS RSA 加密方式

采用RSA加密方式,主要是生成公钥和私钥,公钥用来加密,私钥用来解密,至于其中如何实现的,网上有很多原理. 参见如下: https://github.com/jslim89/RSA-objc PS: 生成私钥 $ openssl genrsa -out private_key.pem 512 生成公钥 $ openssl rsa -in private_key.pem -pubout -out publi

RSA加密、解密、签名、验签 DSA签名、验签

重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 重要的事情说三遍,该篇文章主要是验证JAVA的RSA签名.验签的测试代码,主要代码参考 http://xw-z1985.iteye.com/blog/1837376 下

php 的rsa加密与解密

系统:centos6.5 linux系统生成公私钥对方法: openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 第一条命令生成

C# 与 Java Rsa加密与解密互通

Rsa 加密标准的制定已经过去了十多年了. 这两天在看rsa 加密的文章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项目有用到,所以花了点时间对rsa加密做了一点点了解,发现,不管是java 还是 C# 都对 rsa 的标准加密进行了实现, 是 对于标准是实现,不能互通就讲不过去了. 今天特意写了一段java 代码试了一下,发现是完全可以的. 密钥的描述: C#(.net) 中有三种方式导出密钥,一种是blob,一种是 xml 另一种是参数,其中xml 的方式是

利用openssl生成公钥、私钥 Rsa加密、解密及验证签名

//获取公钥私钥 X509Certificate2 c4 = DataCertificate.GetCertFromCerFile(path + "\\cer\\xx.pem"); string PublicKey = c4.PublicKey.Key.ToXmlString(false);//公钥 X509Certificate2 c3 = DataCertificate.GetCertificateFromPfxFile(path + "\\cer\\yy.pfx&quo