在iOS中使用RSA加密

这里是openssl编译好的库,可以在iOS设备以及MacBook上使用:http://pan.baidu.com/s/1mgkjGs4

如果感兴趣的话可以自行编译openssl的源码,记得编译成arm使用的文件就行.

在xcode中导入

直接将文件拖入xcode目录中即可,如图:

然后,我们如果是swift,我们需要引入一个桥梁,操作如下: 1,File->New->File 2,新建一个C

3,输入名字

4,选择目录

5,最关键的,创建一个桥梁文件

6,创建成功,注意最后那个test-Bridging-Header.h

然后,我们把openssl拖进来

在.h头文件里加上这样两句话:

1
2
void rsajiami(const unsigned char* in,int size,unsigned char* out);
void rsajiemi(const unsigned char* in,unsigned char* out);

就像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//
// testc.h
// test
//
// Created by 杨培文 on 15/2/25.
// Copyright (c) 2015年 杨培文. All rights reserved.
//

#ifndef __test__testc__
#define __test__testc__

#include <stdio.h>

void rsajiami(const unsigned char* in,int size,unsigned char* out);
void rsajiemi(const unsigned char* in,unsigned char* out);

#endif /* defined(__test__testc__) */


然后在.c文件里引入rsa,注意这里的公钥改成自己的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

//
// testc.c
// test
//
// Created by 杨培文 on 15/2/25.
// Copyright (c) 2015年 杨培文. All rights reserved.
//

#include "testc.h"
#include "openssl/rsa.h"
#include "openssl/bn.h"

static char n[] = "EA32BA96FCC395CC766EAFFEBC8EFE1F0886E99504CB7C3877548698793446BA7BA07CF915DBB5BE69337A3697B4DC354DA78ABAE17ED33EDAD87674D0D0D2B54D549E566AF0C016C276F327ADC3D4EE06E64EBC608E4AC9E3CE63416C246FD57DBEA8ADA036AA683F9A812CD8ECA705E019D6A943121CDDB2CF9BF1BCD0F5F9";
static char e[] = "10001";

void rsajiami(const unsigned char* in,int size,unsigned char* out){
RSA *a = RSA_new();
BIGNUM *bn = BN_new();BN_hex2bn(&bn, n);
BIGNUM *be = BN_new();BN_hex2bn(&be, e);
a->e=be;a->n=bn;
RSA_public_encrypt(size, in, out, a, RSA_PKCS1_PADDING);
}

void rsajiemi(const unsigned char* in,unsigned char* out){
RSA *a = RSA_new();
BIGNUM *bn = BN_new();
BN_hex2bn(&bn, n);
BIGNUM *be = BN_new();
BN_hex2bn(&be, e);
a->e=be;a->n=bn;
RSA_public_decrypt(128, in, out, a, RSA_PKCS1_PADDING);
}

然后我们就可以在swift中调用C里面的rsajiami函数:

1
2
3
4
5
func jiami(buf:[Byte])->[Byte]{
var re:[UInt8] = [UInt8](count:128,repeatedValue:0x0)
rsajiami(buf,CInt(countElements(buf)),&re)
return re
}

同样的也可以调用解密函数:

1
2
remain = [UInt8](count:20,repeatedValue:0x0)
rsajiemi(re,&remain)