Необходимо загрузить закрытый ключ PKCS # 8, сгенерированный в Java в iOS из блока NSData - PullRequest
0 голосов
/ 17 апреля 2019

Создание пары ключей в Java и сохранение в db, совместно используемой obj-c на mac ... пара ключей хранится в 2 полях в виде двоичных строк.

Когда я читаю их в приложение Java, оба ключа работают нормально ...

Когда я читаю их в приложении obj-c, открытый ключ обрабатывается нормально, но закрытый ключ выдает ошибку, когда используется для создания SecKeyRef из него.

У меня явно работает Java ... А на obj-c я использую ключ pub для шифрования элементов, а затем без проблем дешифрую их в java с помощью закрытого ключа ... Так что я думаю, что открытый ключ обрабатывается без конца без проблем ... проблема с открытым ключом в obj-c

Примечание: это первый раз, когда я пытаюсь загрузить закрытый ключ в obj-c, где он был сгенерирован в Java ... когда я генерирую пару ключей в obj-c, оба ключа работают нормально, даже когда хранятся в БД в виде закодированных строк и перезагрузки ...

// Java clode that creates pair

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

Base64.Encoder encoder = Base64.getEncoder();
keyGen.initialize(2048);
KeyPair key = keyGen.generateKeyPair();
priv = key.getPrivate();
privenc = encoder.encodeToString(priv.getEncoded());

// i then store privenc in a db and reload it at a later time in java and obj-c apps

// in Java this works and the provate key is usable
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(decoder.decode(privenc));
PrivateKe priv = keyFactory.generatePrivate(privateKeySpec);    

//in obj-c this fails
//self.privenc in obj-c is identical to privenc in java above

NSDictionary* optionsPriv = @{(id)kSecAttrKeyType: (id)kSecAttrKeyTypeRSA,
                                  (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPrivate,
                                  (id)kSecAttrKeySizeInBits: @2048,
                                  };

NSData *k_as_data = [[NSData alloc] initWithBase64EncodedString:self.privenc options:NSDataBase64DecodingIgnoreUnknownCharacters];

SecKeyRef privateKey = SecKeyCreateWithData((__bridge CFDataRef)k_as_data, (__bridge CFDictionaryRef)optionsPriv, &error);
    if (!privateKey)
    {
        NSError *err = CFBridgingRelease(error);
        NSLog(@"Error on private key %@",err);
    } // fails

//With the following error:
//Error on private key Error Domain=NSOSStatusErrorDomain Code=-50 
// "RSA private key creation from data failed" 
// (paramErr: error in user parameter list) 
// UserInfo={NSDescription=RSA private key creation from data failed}
//
//I think i have something wrong in the options dictionary, 
//but i am at a loss and could use some advice....

В идеале код obj-c должен создать закрытый ключ SecKeyRef из массива NSData ... Фактический результат, как отмечено в ошибке

Ошибка в закрытом ключе. Ошибка Domain = NSOSStatusErrorDomain Code = -50 «Ошибка создания личного ключа RSA из данных» (paramErr: ошибка в списке параметров пользователя) UserInfo = {NSDescription = Ошибка создания личного ключа RSA из данных}

...