[IOS]xcode生成公钥私钥

算法的天空 2018-11-19

1.通过MAC终端可以生成:

参考:https://www.anquanke.com/post/id/151220?from=timeline

生成EC秘钥命令:openssl ecparam -genkey -name secp256r1 > test_ecc.key     (pem)

查看命令:openssl ec -text < test_ecc.key

生成公钥:openssl ec -in test_ecc.key -pubout -out test_ec_pubkey.pem

查看曲线参数:openssl ecparam -list_curves

2.XCODE:

 key algorithm:EC 对应:kSecAttrKeyTypeEC

(https://developer.apple.com/documentation/security/ksecattrkeytypeec?language=objc)

但是过期了,现在用kSecAttrKeyTypeECSECPrimeRandom

(https://developer.apple.com/documentation/security/ksecattrkeytypeecsecprimerandom?language=objc)

对应java的secp算法

常用的非对称加密算法包括:

(1)RSA:因由 RSA 公司发明而命名,是一个支持变长密钥的公开密钥算法,需要加密的文件块的长度也是可变的;公开密钥算法总是要依据一个数学上的难题。RSA基于大素数积难分解问题,给定两个数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。

(2)ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。椭圆曲线因为用二元三次方程y^2= x^3+ ax + b来表示,类似椭圆周长计算方程而得名。公开秘钥算法要基于一个数学难题,椭圆曲线算法就是基于离散对数问题。有限域Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。

区块链中用到的签名算法SECP256K1

区块链中生成公钥时用到的算法是SECP256K1,是一种椭圆曲线的标准化表达方式,其中256表示该椭圆曲线是256位, K代表Koblitz curve,相对应的椭圆曲线的标准换表达还有,SECP192K1,SECP192R1,SECP224K1,SECP224R1,SECP256R1,SECP384R1,SECP521R1等。

IOS:

NSDictionary *parameters = @{
                                 (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeECSECPrimeRandom,
                                 (__bridge id)kSecAttrKeySizeInBits: @192,
                                 (__bridge id)kSecPrivateKeyAttrs: @{
                                         (__bridge id)kSecAttrIsPermanent: @YES,
                                         (__bridge id)kSecAttrApplicationTag: [@"my.key.tag" dataUsingEncoding:NSUTF8StringEncoding],
                                         },
                                 (__bridge id)kSecPublicKeyAttrs: @{
                                         (__bridge id)kSecAttrIsPermanent: @YES,
                                         (__bridge id)kSecAttrApplicationTag: [@"my.key.pubtag" dataUsingEncoding:NSUTF8StringEncoding],
                                         }
                                 };
    
    SecKeyRef publicKey, privateKey;
    OSStatus status = SecKeyGeneratePair((__bridge CFDictionaryRef)parameters, &publicKey, &privateKey);
    
    NSData * publicKeyBits = nil;
    NSData * privateKeyBits = nil;
    NSString *privateKeyBitsString = nil;
    if (status == errSecSuccess) {
        publicKeyBits = (__bridge NSData *)((__bridge SecKeyRef)(CFBridgingRelease(publicKey)));
        privateKeyBitsString = (__bridge NSString *)(privateKey);

        
        // Remove from Keychain again:
        (void)SecItemDelete((__bridge CFDictionaryRef) parameters);
    }

 不知道为什么openssl生成的public key和ios security framework生成的长度并不一样

相关推荐