Создание пары ключей в 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 из данных}