Шифрование в Java с RSA / ECB / OAEPWithSHA-256AndMGF1Padding не может быть расшифровано в. NET - PullRequest
0 голосов
/ 07 мая 2020

У нас есть требование, где в Java выполняется шифрование, а NET - дешифрование. Проблема связана с расшифровкой Asymmetri c в. NET, алгоритм, режим и заполнение, используемые в Java, в то время как шифрование - «RSA / ECB / OAEPWithSHA-256AndMGF1Padding». На. NET, я пытался разными способами расшифровать RsaCng, Rsa, Chilkat Rsa, Bouncy Castle с заполнением OAEP, пока ничего не работало. Ниже приведены фрагменты кода. Только когда метод шифрования Java изменен на "RSA / ECB / OAEPWithSHA-1AndMGF1Padding", NET смог расшифровать, но по соображениям безопасности Java не может изменить подход к шифрованию. Мы используем файл PEM для дешифрования, а для шифрования - CERT. Сообщите нам, как лучше всего решить проблему. Это как-то связано с созданием файла PEM на основе SHA256 ha sh? Буду признателен, если кто-нибудь может мне помочь.

Ошибки указаны ниже. RsaCng и Rsa: - Неверный параметр. RsaCryptoService: - Ошибка при декодировании заполнения OAEP. Bouncy Castle: - Он давал строку альфа-юникода с символами. Chilkat: - Возвращает null.

Java Фрагмент для асимметрии c Шифрование: -

                 // Encrypt the symetric key
                 X509Certificate cert = ConduentCertificateLocator.getConduentCertificate();
                 PublicKey certKey = cert.getPublicKey();
                 Cipher c2 = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
                 //Cipher c2 = Cipher.getInstance("RSA");
                 c2.init(Cipher.ENCRYPT_MODE, certKey);
                 byte[] inputCertKey = key.getEncoded();
                 byte[] encryptedKey = c2.doFinal(inputCertKey);
                 String encryptedKeyUrl = encodeToURL(encryptedKey);

. NET Фрагмент для асимметрии c Расшифровка: - Мы попробовали несколько разных способов. Ниже приведен код.

a. RSACryptoService

           using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
            {
                using (var stream = File.OpenRead(_appSettings.PEM))
                using (var reader = new PemUtils.PemReader(stream))
                {
                    var rsaParameters = reader.ReadRsaKey();
                    csp.ImportParameters(rsaParameters);

                    var resultBytes = csp.Decrypt(ksBytes, true);
                    finalResult = Convert.ToBase64String(resultBytes);
                }
            }

б. RsaCng

           using (RSA rsa = new RSACng())
            {
                using (var stream = File.OpenRead(_appSettings.PEM))
                using (var reader = new PemUtils.PemReader(stream))
                    rsa.ImportParameters(reader.ReadRsaKey());
                byte[] decrypted2 = rsa.Decrypt(ksBytes, RSAEncryptionPadding.OaepSHA256);
                var ss = Encoding.UTF8.GetString(decrypted2);
            }

c. Rsa (System.Security.Cryptography)

          using (RSA rsa = RSA.Create())
            {
                using (var stream = File.OpenRead(_appSettings.PEM))
                using (var reader = new PemUtils.PemReader(stream))
                {
                    var rsaParameters = reader.ReadRsaKey();

                    rsa.ImportParameters(rsaParameters);
                }


                finalResult = rsa.Decrypt(ksBytes, RSAEncryptionPadding.OaepSHA256);
            }

d. Чилкат

       using (PrivateKey pkey = new PrivateKey())
        {
            pkey.LoadPemFile(_appSettings.PEMFile);
            key = pkey.GetXml();
        }

        using (Chilkat.Rsa decryptor = new Chilkat.Rsa())
            {
                decryptor.ImportPrivateKey(key);

                // Make sure we have the same settings used for encryption.
                decryptor.OaepPadding = true;
                decryptor.EncodingMode = "hex";
                decryptor.OaepHash = "sha-256";

                string eStr = decryptor.DecryptStringENC(ks, true);
            }

д. Надувной Замок

        AsymmetricCipherKeyPair keyPair;
        using (var reader = File.OpenText(_appSettings.PEM))
            keyPair = (AsymmetricCipherKeyPair)new 
           Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();
          var decryptEngine = new OaepEncoding(new RsaBlindedEngine(), new Sha256Digest(), new 
               Sha1Digest(), null);
            decryptEngine.Init(false, keyPair.Private);
            var decrypted = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(ksBytes, 0, 
             ksBytes.Length));
...