Мне нужно реализовать алгоритм шифрования AES в синтаксисе криптографического сообщения (CMS) стандарт для шифрования моих данных в Windows Universal App (найденная ссылка здесь). Я реализовал его на Java, используя библиотеку Bouncy Castle, используя следующий код (мне нужна такая же функциональность в С# UWP):
private static final ASN1ObjectIdentifier CMS_ENCRYPTION_ALGO = CMSAlgorithm.AES256_CBC;
private byte[] encrypt(byte[] key, byte[] dataToBeEncrypted) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException, CMSException {
final KeySpec keySpec = new X509EncodedKeySpec(key);
final KeyFactory factory = KeyFactory.getInstance("RSA");
final PublicKey publicKey = factory.generatePublic(keySpec);
final SubjectKeyIdentifier subjectKeyIdentifier = new JcaX509ExtensionUtils().createSubjectKeyIdentifier(publicKey);
final RecipientInfoGenerator recipientInfoGenerator = new JceKeyTransRecipientInfoGenerator(subjectKeyIdentifier.getEncoded(), publicKey);
final CMSEnvelopedDataGenerator generator = new CMSEnvelopedDataGenerator();
generator.addRecipientInfoGenerator(recipientInfoGenerator);
final OutputEncryptor encryptor = new JceCMSContentEncryptorBuilder(CMS_ENCRYPTION_ALGO).build();
final CMSProcessableByteArray content = new CMSProcessableByteArray(dataToBeEncrypted);
final CMSEnvelopedData envelopedData = generator.generate(content, encryptor);
return envelopedData.toASN1Structure().getEncoded(ASN1Encoding.DER);
}
Теперь у меня есть ссылка Bouncy Castle V 1.8.1 в моем приложении UWP, но я нашел много отличий (некоторые библиотеки, используемые в Java, но не существуют в Windows) и не мог реализовать такие функции на С#.
Так любезно или направляйте меня, чтобы реализовать то же самое с помощью собственной библиотеки криптографии UWP Windows.Security.Cryptography
(Preferred),
Или скажите мне, как я могу реализовать ту же функциональность, используя Bouncy Castle 1.8.1 в приложении С# UWP.
Update:
Основываясь на следующей диаграмме здесь, я понимаю, что требуемые шаги:
1- Получить данные и сгенерировать Симметричный ключ для шифрования данных с помощью алгоритма AesCbcPkcs7.
2- Шифровать симметричный ключ с помощью открытого ключа
3- Генерировать сообщение с оцифрованной огибающей.
Итак, я сделал первые два шага, основанные на моем понимании, используя следующий код С# (Пожалуйста, исправьте меня, если я ошибаюсь), и мне нужна помощь, чтобы сделать третий шаг:
public string EncryptAndEnvelope(string openText, string p_key)
{
// Step 1 Get the data and generate Symmetric Key to encrypt the data using algorithm AesCbcPkcs7
IBuffer cBuffer = CryptographicBuffer.GenerateRandom(32);
SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
CryptographicKey m_key = provider.CreateSymmetricKey(cBuffer);
IBuffer bufferMsg = CryptographicBuffer.ConvertStringToBinary(AsciiToString(StringToAscii(openText)), BinaryStringEncoding.Utf8);
IBuffer bufferEncrypt = CryptographicEngine.Encrypt(m_key, bufferMsg, null);
// Step 2 Encrypt Symmetric Key using the public key
IBuffer publicKey = CryptographicBuffer.DecodeFromBase64String(p_key);
AsymmetricKeyAlgorithmProvider asym = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1);
CryptographicKey ckey = asym.ImportPublicKey(publicKey, CryptographicPublicKeyBlobType.X509SubjectPublicKeyInfo);
IBuffer cbufferEncrypt = CryptographicEngine.Encrypt(ckey, cBuffer, null);
// Step 3 Generate Digitally enveloped message
// I need help here
}
private byte[] StringToAscii(string s)
{
byte[] retval = new byte[s.Length];
for (int ix = 0; ix < s.Length; ++ix)
{
char ch = s[ix];
if (ch <= 0x7f) retval[ix] = (byte)ch;
else retval[ix] = (byte)'?';
}
return retval;
}
private string AsciiToString(byte[] bytes)
{
return string.Concat(bytes.Select(b => b <= 0x7f ? (char)b : '?'));
}
Примечание. Пока я искал решение, я обнаружил, что ответ доступен с помощью библиотеки
System.Security.Cryptography
(но он не поддерживается в Universal Apps), и я уверен, что реализация доступна с помощью Bouncy Castle (есть тонны документации для Java , но, к сожалению, нет документация вообще для С#).