使用苹果原生库对数据进行RSA加密解密加签验签

1.本篇使用了苹果的原生库对字符串进行RSA加密解密,并对网上的一些资料进行了分类整理,归纳总结,并参考了苹果官方demo。

2.RSA简介:RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

RSA的算法涉及三个参数,n、e1、e2。

其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。

RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)

3.实际使用:RSA中使用的公钥私钥一般是产品或者后台提供的,如果没有请自己生产(http://www.jianshu.com/p/4a3270b0befe),并提供给后台一份。

客户端使用公钥对发送给服务器的数据进行加密,使用私钥对发送给服务器的数据加签。

服务器使用公钥对接受的数据进行验签,使用私钥对接受的数据进行解密。

4.代码部分:只是简单的介绍下,请如果需要请自行去下载

//获取hash包装后的blob

+ (NSData *)getHashBytes:(NSData *)plainText {

CC_SHA1_CTX ctx;

uint8_t * hashBytes = NULL;

NSData * hash = nil;

// Malloc a buffer to hold hash.

hashBytes = malloc( kChosenDigestLength * sizeof(uint8_t) );

memset((void *)hashBytes, 0x0, kChosenDigestLength);

//初始化

CC_SHA1_Init(&ctx);

// 装载数据

CC_SHA1_Update(&ctx, (void *)[plainText bytes], (CC_LONG)[plainText length]);

// 输出进hash转化后的数据

CC_SHA1_Final(hashBytes, &ctx);

// Build up the SHA1 blob.

hash = [NSData dataWithBytes:(const void *)hashBytes length:(NSUInteger)kChosenDigestLength];

if (hashBytes){

free(hashBytes);

hashBytes = NULL;

}

return hash;

}

//对blob使用私钥进行加签

+ (NSData*)signData:(NSData*)data withKeyRef:(SecKeyRef)keyRef{

const uint8_t* bytes = (const uint8_t*)[[self getHashBytes:data] bytes];

size_t block_size = SecKeyGetBlockSize(keyRef);

uint8_t* outbuf = (uint8_t*)malloc(block_size);

memset((void *)outbuf, 0x0, block_size);

OSStatus status = noErr;

status = SecKeyRawSign(keyRef, kSecPaddingPKCS1SHA1, bytes , kChosenDigestLength, outbuf, &block_size);

NSData* signData;

if (status == noErr)

{

signData = [NSData dataWithBytes:(const void *)outbuf length:(NSUInteger)block_size];

}

else

{

return nil;

}

if (outbuf)

{

free(outbuf);

outbuf = NULL;

}

return signData;

}

//验签

+(NSData*)vertifyData:(NSData*)data withKeyRef:(SecKeyRef)keyRef{

const uint8_t* bytes = (const uint8_t*)[[self getHashBytes:data] bytes];

size_t block_size = SecKeyGetBlockSize(keyRef);

uint8_t* outbuf = (uint8_t*)malloc(block_size);

memset((void *)outbuf, 0x0, block_size);

OSStatus status = noErr;

status = SecKeyRawVerify(keyRef, kSecPaddingPKCS1SHA1, bytes, kChosenDigestLength, outbuf, block_size);

NSData* vertifyData;

if (status == noErr) {

vertifyData = [NSData dataWithBytes:outbuf length:(NSUInteger)block_size];

}else{

return nil;

}

if (outbuf)

{

free(outbuf);

outbuf = NULL;

}

return vertifyData;

}

demo地址:https://github.com/yangyongtime/RSASecurity

你可能感兴趣的:(使用苹果原生库对数据进行RSA加密解密加签验签)