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