Intro
Я работаю над преобразованием библиотеки Java в .Net.
Библиотека представляет собой реализацию расшифровки полиморфного псевдонима и будет использоваться в Нидерландахрасшифровать "BSNk" в области европейских служб электронной идентификации eIDAS.
Я уже преобразовал большую часть библиотеки и работал с автором версии Java для проверки результатов.Следующий шаг - сделать библиотеку .Net действительно полезной для голландских компаний, и вот где я застрял последние 2 недели.
Алгоритмы используют эллиптическую кривую в файле PEM в качестве одной из частей.для расчета.Но клиенты (пользователи библиотеки) получат это в виде файла p7 и p8, который можно преобразовать / извлечь / декодировать (?) В данные PEM.
Вопрос
Как я могу получить из файлов p7 + p8 строку PEM в C #?
Желательно использовать только System.Security.Cryptography.Pkcs, но в настоящее время я использую BouncyCastle в другихчасти (потому что версия Java сделала).Не перечислено ниже, но я также пытался сделать это, используя SignedCms и EnvelopedCms, но ничего не получил, кроме (для меня) непонятных ошибок.У меня нет большого опыта в криптографии, но я многому научился за последние несколько недель.
Если я правильно понимаю, я бы объяснил это, поскольку файл p7 является конвертом PEMсообщение, а конверт подписан / зашифрован с использованием закрытого ключа в файле p8?
код
public static string ConvertToPem(string p7File, string p8File)
{
var p7Data = File.ReadAllBytes(p7File);
var p8Data = File.ReadAllBytes(p8File);
// Java version gets the private key like this:
// KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(bytesArray));
var privateKey = PrivateKeyFactory.CreateKey(p8Data);
var parser = new CmsEnvelopedDataParser(p7Data);
var recipients = parser.GetRecipientInfos().GetRecipients().OfType<RecipientInformation>();
var recipientInformation = recipients.First();
//Java version gets the message like this:
//final byte[] message = keyInfo.getContent(new JceKeyTransEnvelopedRecipient(key).setProvider("BC"));
var keyInfo = (KeyTransRecipientInformation)recipientInformation;
var message = keyInfo.GetContent(privateKey);
return Encoding.ASCII.GetString(message);
}
обновление 8-10-2018 Следуя совету автора библиотеки Java, я попытался пропустить проблему автоматического преобразования в PEM и просто использовать openssl для его расшифровки.К сожалению, команда openssl для расшифровки файлов также не работает!Как в Windows, так и в Linux.Странно то, что это делается с использованием тех же файлов, которые прекрасно работают при использовании в библиотеке Java.Р8 коррумпирован?Это как-то совместимо только при использовании в Java JceKeyTransEnvelopedRecipient ???
openssl cms -decrypt -inform DER -in dv_keys_ID_D_oin.p7 -inkey privatep8.key -out id.pem
(я также пытался использовать PEM вместо DER, но безрезультатно. Файлы находятся в репозитории GitHub)
Обновление 9-10-2018 Спасибо Карлу, который выяснил причину, по-видимому, поврежденного файла p8.Вместо того, чтобы напрямую расшифровывать его с помощью openssl cms, нам нужно было сначала преобразовать двоичный DER p8 в PEM, закодированный в base64.
openssl pkcs8 -inform der -outform pem -in private.p8 -out private-p8.pem -topk8 -nocrypt
Мы могли бы также сделать это в c #, считав байты из файла p8, преобразовав ихк Base64 и добавив вокруг него верхний / нижний колонтитул BEGIN / END PRIVATE KEY.
Ресурсы
Вы можете увидеть, что этот код используется и не проходит как модульный тест в моемпроект.Проект также включает в себя соответствующие файлы p7, p8 и PEM для тестирования.
Версию Java можно найти здесь: https://github.com/BramvanPelt/PPDecryption
Моя версия незавершенной работы находится здесь: https://github.com/MartijnKooij/PolymorphicPseudonymisation