美文网首页
使用苹果原生库对数据进行RSA加密解密加签验签

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

作者: 我的月亮你的心 | 来源:发表于2017-03-16 16:36 被阅读114次

    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加密解密加签验签

          本文链接:https://www.haomeiwen.com/subject/jtdjnttx.html