Подтвердить что ты не робот

UWP Standard CMS Enveloped Encryption

Мне нужно реализовать алгоритм шифрования 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 , но, к сожалению, нет документация вообще для С#).

4b9b3361