当前位置:首页 » 密码管理 » ios中rsa加密

ios中rsa加密

发布时间: 2022-08-06 12:10:47

A. ios 中开发中用户信息中的加密方式有哪些

5.1 通过简单的URLENCODE + BASE64编码防止数据明文传输
5.2 对普通请求、返回数据,生成MD5校验(MD5中加入动态密钥),进行数据完整性(简单防篡改,安全性较低,优点:快速)校验。
5.3 对于重要数据,使用RSA进行数字签名,起到防篡改作用。
5.4 对于比较敏感的数据,如用户信息(登陆、注册等),客户端发送使用RSA加密,服务器返回使用DES(AES)加密。
原因:客户端发送之所以使用RSA加密,是因为RSA解密需要知道服务器私钥,而服务器私钥一般盗取难度较大;如果使用DES的话,可以通过破解客户端获取密钥,安全性较低。而服务器返回之所以使用DES,是因为不管使用DES还是RSA,密钥(或私钥)都存储在客户端,都存在被破解的风险,因此,需要采用动态密钥,而RSA的密钥生成比较复杂,不太适合动态密钥,并且RSA速度相对较慢,所以选用DES)
把相关算法的代码也贴一下吧 (其实使用一些成熟的第三方库或许会来得更加简单,不过自己写,自由点)。注,这里的大部分加密算法都是参考一些现有成熟的算法,或者直接拿来用的。
1、MD5
//因为是使用category,所以木有参数传入啦

-(NSString *) stringFromMD5 {
if(self == nil || [self length] == 0) {
return nil;
}
const char *value = [self UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, strlen(value), outputBuffer);
NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
return [outputString autorelease];
}

2、Base64

+ (NSString *) base64EncodeData: (NSData *) objData {
const unsigned char * objRawData = [objData bytes];
char * objPointer;
char * strResult;

// Get the Raw Data length and ensure we actually have data
int intLength = [objData length];
if (intLength == 0) return nil;

// Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
objPointer = strResult;

// Iterate through everything
while (intLength > 2) { // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
*objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];

// we just handled 3 octets (24 bits) of data
objRawData += 3;
intLength -= 3;
}

// now deal with the tail end of things
if (intLength != 0) {
*objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
if (intLength > 1) {
*objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
*objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];
*objPointer++ = '=';
*objPointer++ = '=';
}
}

// Terminate the string-based result
*objPointer = '\0';

NSString *rstStr = [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
free(objPointer);
return rstStr;
}

3、AES
-(NSData*) EncryptAES: (NSString *) key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer);
return nil;
}

4、RSA

- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}

void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];

size_t cipherLen = 128; // currently RSA key length is set to 128 bytes
void *cipher = malloc(cipherLen);

OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);

NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}

free(plain);
free(cipher);

return result;
}

B. ios怎么实现RAS加密解密

转载最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。
第一步,制作自签名的证书
1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示输入内容就行了。
几个说明:
public_key.der是输出的自签名的x509证书,即我们要用的。
private_key.pem是输出的私钥,用来解密的,请妥善保管。
rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。
-days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。
事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)
1)创建私钥
openssl genrsa -out private_key.pem 1024
2)创建证书请求(按照提示输入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自签署根证书
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。

第二步,使用public_key.der来进行加密。
1.导入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.从public_key.der读取公钥。
4.加密。
下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)
RSA.h
//
// RSA.h
//
#import <Foundation/Foundation.h>

@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}

- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;

@end

RSA.m
//
// RSA.m
//
#import "RSA.h"

@implementation RSA

- (id)init {
self = [super init];

NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}

NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}

certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}

policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}

SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}

publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}

maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}

- (NSData *) encryptWithData:(NSData *)content {

size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}

void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];

size_t cipherLen = 128; // 当前RSA的密钥长度是128字节
void *cipher = malloc(cipherLen);

OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);

NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}

free(plain);
free(cipher);

return result;
}

- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}

- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}

@end

使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}

C. IOS RSA非对称加密问题

这个可以试着自己弄。

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

1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: 代码如下: 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 第一条命令生成原始 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放在这个文件夹中 喜欢加密解密的小伙伴一定要好好看看这篇文章,受益匪浅。。。

E. IOS中RSA加密之后,后台解出来前面有乱码怎么解决

这个问题不是加密和解密的事件,而是没能正确地使用相同的字符集编码。

加密之前就应该约定双方使用同一个字符集编码来做编解码,比如用 UTF8,我们在用一个 byte[] 创建一个 String 时应该明确地指定字符集编码而不能使用默认值,因此默认值是跟操作系统或程序启动时的命令行有依赖关系的,这很难预料谁会使用你的程序,又会如何使用你的程序,我们明确地指定字符集就不会受此影响。

String a = "汉字“

byte[] bytes = a.getBytes("UTF8");

byte[] encoded = encode(bytes);

byte[] decoded = decode(encoded);

String received = new String(decoded, "UTF8");

F. 如何在IOS中使用RSA加密,能够与.NET的服务器互通

在 ios 上你需要使用证书加密。
首先生成一张证书。微软的.Net framework SDK为我们提供了一个生成X.509数字证书的命令行工具Makecert.exe。
打开.Net的控制台,使用如下命令生成证书:
makecert -sr LocalMachine -ss My -n CN=Theoservice -sky exchange -pe

然后,开始->运行->MMC,打开MMC控制台。文件->添加/删除管理单元->添加按钮->选”证书”->添加->选”计算机账户”->关闭->确定,然后你就可以在 “个人->证书” 里看到刚才生成的证书了。证书采用1024位密钥加密。现在,你需要做得就是导出这张证书。如果你的服务器并不是本机,你首先需要导出一个带私钥的pfx格式的证书。导出时需要你填写密码来保护这张证书,然后将其导入到服务器上就好了。此外,你还需要导出一份不带私钥的cer格式的证书。这张证书只含有公钥,是用来和客户端一起发布出去用来加密数数据的。

证书有了以后就是加密解密。C#程序,估计这个你已经写过。
然后将导出的证书导入到你的 IOS程序中,写相应的程序。

注意:RSA分组加密是采用了1024位的密钥,所以密钥长度为1024/8=128个byte。而C#默认采用#PKSC1的padding模式,每次最多可以加密128-11=117个byte。也就是说,RSA分组加密算法每次从明文里取<=117个byte,然后加密成128个byte的密文;解密的时候,每次就取128个byte的密文,将其解密成<=117个byte的明文。因为#PKSC1的padding模式每次padding的内容是随机的,所以即使是加密同一段明文,每次的结果也不一样,这大大的增加了数据安全性。

ios端:就是每次取117个byte的明文并加密成128个byte的密文,最后连起来做base64编码。

G. ios导入rsa加密为什么真机报错

RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学着:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。 它的原理较为简单,假设有消息发送方A和消息接收方B,通过下面的几个步骤,就可以完成消息的加密传递: 消息发送方A在本地构建密钥对,公钥和私钥; 消息发送方A将产生的公钥发送给消息接收方B; B向A发送数据时,通过公钥进行加密,A接收到数据后通过私钥进行解密,完成一次通信; 反之,A向B发送数据时,通过私钥对数据进行加密,B接收到数据后通过公钥进行解密。 由于公钥是消息发送方A暴露给消息接收方B的,所以这种方式也存在一定的安全隐患,如果公钥在数据传输过程中泄漏,则A通过私钥加密的数据就可能被解密。 如果要建立更安全的加密消息传递模型,需要消息发送方和消息接收方各构建一套密钥对,并分别将各自的公钥暴露给对方,在进行消息传递时,A通过B的公钥对数据加密,B接收到消息通过B的私钥进行解密,反之,B通过A的公钥进行加密,A接收到消息后通过A的私钥进行解密。 当然,这种方式可能存在数据传递被模拟的隐患,但可以通过数字签名等技术进行安全性的进一步提升。由于存在多次的非对称加解密,这种方式带来的效率问题也更加严重。

H. 怎么在ios进行rsa公钥加密,java做rsa私钥解密

1、用公钥加密,用私钥解密。
2、给别人发信息,就从服务器上拉下来别人的公钥,加密后发给他。
3、对方拿到信息后用自己的私钥解密。
4、这样,公钥加密后除了私钥持有人,别人都看不到信息。
5、若是用私钥加密,那么公钥都能解密,还有何安全性可言?
6、私钥加密的场合只有一个,那就是数字签名,用来表明这个信息来源于你。

I. IOS中怎么做RSA加密算法

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

1、使用openssl生成密匙对。

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

#!/usr/bin/envbash
echo"GeneratingRSAkeypair..."
echo"1024RSAkey:private_key.pem"
opensslgenrsa-outprivate_key.pem1024

echo":rsaCertReq.csr"
opensslreq-new-keyprivate_key.pem-outrsaCertReq.csr

echo"createcertificationusingx509:rsaCert.crt"
opensslx509-req-days3650-inrsaCertReq.csr-signkeyprivate_key.pem-outrsaCert.crt

echo"createpublic_key.derForIOS"
opensslx509-outformder-inrsaCert.crt-outpublic_key.der

echo"createprivate_key.p12ForIOS.Pleaserememberyourpassword.ThepasswordwillbeusediniOS."
opensslpkcs12-export-outprivate_key.p12-inkeyprivate_key.pem-inrsaCert.crt

echo"creatersa_public_key.pemForJava"
opensslrsa-inprivate_key.pem-outrsa_public_key.pem-pubout
echo"createpkcs8_private_key.pemForJava"
opensslpkcs8-topk8-inprivate_key.pem-outpkcs8_private_key.pem-nocrypt

echo"finished."

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

代码:

RSAEncryptor*rsa=[[RSAEncryptoralloc]init];

NSLog(@"encryptorusingrsa");
NSString*publicKeyPath=[[NSBundlemainBundle]pathForResource:@"public_key"ofType:@"der"];
NSLog(@"publickey:%@",publicKeyPath);
[rsaloadPublicKeyFromFile:publicKeyPath];

NSString*securityText=@"hello~";
NSString*encryptedString=[rsarsaEncryptString:securityText];
NSLog(@"encrypteddata:%@",encryptedString);

对应解密代码:

NSLog(@"decryptorusingrsa");
[rsaloadPrivateKeyFromFile:[[NSBundlemainBundle]pathForResource:@"private_key"ofType:@"p12"]password:@"123456"];
NSString*decryptedString=[rsarsaDecryptString:encryptedString];
NSLog(@"decrypteddata:%@",decryptedString);

RSA基本原理:

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

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

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

J. ios openssl rsa 加密问题

对于您的操作,我这里有几点建议:

  1. RSA模式的加密,加密数据的长度需要等于模长,对于这么短的密文,建议使用PKCS1标准进行打补丁,然后加解密;

  2. 模长1024的p1打补丁模式输入数据长度最多不能超过117字节,其余字节需要进行打补丁操作;

  3. 对于RSA加解密及签名验签,通常会结合哈希算法使用,对输入数据进行哈希,然后打补丁,这样可以不用限制输入数据的长度;

  4. openssl本身是跨平台的,建议您使用打补丁模式在不同平台下进行测试。

热点内容
vba获取网页表格数据库数据库数据库 发布:2024-05-18 12:23:24 浏览:699
腾讯服务器为什么卡顿 发布:2024-05-18 12:02:12 浏览:305
如何知道密码锁有没有nfc 发布:2024-05-18 11:58:09 浏览:961
单片机c语言模块化编程 发布:2024-05-18 11:53:16 浏览:644
win7xp共享打印机拒绝访问 发布:2024-05-18 11:51:00 浏览:847
zkeys金属服务器怎么使用 发布:2024-05-18 11:49:31 浏览:581
电信路由器密码设置无线路由器怎么设置密码 发布:2024-05-18 10:55:00 浏览:647
安卓系统是属于哪个国家的手机 发布:2024-05-18 10:41:41 浏览:99
linux运维前景 发布:2024-05-18 10:24:44 浏览:658
c语言crc算法 发布:2024-05-18 09:59:03 浏览:644