IOS ECC SecKeyCreateWithData SecKeyRef 探索

IOS ECC 加密探索随笔:

//使用该方法无法用PEM格式公钥生成SecKeyRef 公钥,待解决。

+(SecKeyRef)getPublicKeyFromPem:(NSString*)key{

    // 下面是对于 PEM 格式的密钥文件的密钥多余信息的处理,通常 DER 不需要这一步

    //NSString *key = @"PEM 格式的密钥文件";

    NSRange spos;

    NSRange epos;

    //-----BEGIN PUBLIC KEY-----

    spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"];

    if(spos.length > 0){

        epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"];

    }else{

        spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"];

        epos = [key rangeOfString:@"-----END PUBLIC KEY-----"];

    }

    if(spos.location != NSNotFound && epos.location != NSNotFound){

        NSUInteger s = spos.location + spos.length;

        NSUInteger e = epos.location;

        NSRange range = NSMakeRange(s, e-s);

        key = [key substringWithRange:range];

    }

    key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];

    key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];

    // This will be base64 encoded, decode it.

    //NSData *data = base64_decode(key);

    NSData *data = [UtilityHelper Base64Convert2Str:key]

    //NSData *data =[key dataUsingEncoding:NSUTF8StringEncoding];

    if(!data){

        return nil;

    }

    NSString * strtemp  =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


    // 设置属性字典

    NSMutableDictionary *options = [NSMutableDictionary dictionary];

    //并尝试kSecAttrKeyTypeEC 也不行

    options[(__bridge id)kSecAttrKeyType] = (__bridge id) kSecAttrKeyTypeECSECPrimeRandom;

    options[(__bridge id)kSecAttrKeyClass] = (__bridge id) kSecAttrKeyClassPublic;

    NSNumber *size = @2048;

    options[(__bridge id)kSecAttrKeySizeInBits] = size;

    NSError *error = nil;

    CFErrorRef ee = (__bridge CFErrorRef)error;


    // 调用接口获取密钥对象

    SecKeyRef ret = SecKeyCreateWithData((__bridge CFDataRef)data, (__bridge CFDictionaryRef)options, &ee);

    if (error) {

        return nil;

    }

    return ret;

}

公钥PEM为:-----BEGIN PUBLIC KEY-----

MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2+nDUyXeL6wAu5UAIIhdFdClJNdysydKysyozXtY

W3xXb6szLjA0FpV+mRcHWl+28cV4LxjqTEs+pEvu3bVzng==

-----END PUBLIC KEY-----

运行情况:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 嘟哝嘟哝:最近接到一个任务:在客户端动态生成RSA密钥对,然后向服务器发送这个密钥对中的公钥字符串,由服务器进行公...
    TimmyR阅读 8,134评论 19 21
  • /**ios常见的几种加密方法: 普通的加密方法是讲密码进行加密后保存到用户偏好设置( [NSUserDefaul...
    彬至睢阳阅读 3,079评论 0 7
  • 之前的项目中接触过一些加密的方法,也没有太仔细的进行记录和研究。最近在写SDK时,加密模块的占比相当之大;借此时机...
    过半_e764阅读 645评论 0 0
  • 查询缓存 查询缓存是一个建立在数据缓存之上的特殊缓存特性。它用于缓存数据库查询的结果。(PS需配置好缓存配置) 查...
    HongXunPan阅读 898评论 0 1
  • 我把这些明亮的绿意隐进诗行 不向路人展示曾经的忧伤 越来越盛的花开绿浓 越来越淡的尘埃粘着光 我把它们打包投递 向...
    杨昊田阅读 2,598评论 208 167