gpt4 book ai didi

.net - 无法在 .NET 中解密使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 在 Java 中加密

转载 作者:行者123 更新时间:2023-12-04 10:04:21 47 4
gpt4 key购买 nike

我们有一个要求,在 Java 中进行加密而 .NET 进行解密。问题在于 .NET 中的非对称解密,Java 中使用的算法、模式和填充,而加密是“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”。在 .NET 上,我尝试以各种不同的方式解密 RsaCng、Rsa、Chilkat Rsa、带有 OAEP 填充的 Bouncy CaSTLe,但到目前为止没有任何效果。以下是代码片段。只有当Java的加密方式改为“RSA/ECB/OAEPWithSHA-1AndMGF1Padding”时,.NET才能解密,但出于安全原因,Java无法改变加密方式。我们使用 PEM 文件进行解密,同时使用 CERT 进行加密。请让我们知道解决问题的最佳方法。这与创建基于 SHA256 哈希的 PEM 文件有关吗?如果有人能帮助我,我将不胜感激。

下面提到了错误。RsaCng 和 Rsa:- 参数不正确。RsaCryptoService:- 解码 OAEP 填充时出错。Bouncy CaSTLe:- 它给出了带有符号的 alpha-unicode 字符串。奇尔卡特:- 返回 null。

用于非对称加密的 Java 代码段:-

                 // 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 代码段:- 我们确实尝试了几种不同的方法。下面是代码。

一个。 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);
}
}

反差

           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);
}

Rsa(系统.安全.密码学)

          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);
}

奇尔卡特

       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));

最佳答案

我的情况略有不同,但应该对您有所帮助。我需要用 java 解密,它在 .NET 中加密。所以与提出的问题相反,但就像其他人提到的那样。即使您指定 RSA/ECB/OAEPWithSHA-256AndMGF1Padding ,引擎盖下的 Java 默认为 SHA-1。对我来说,诀窍是传递一个额外的参数,告诉它实际使用 SHA-256。

Java:

private static byte[] decryptBytes(byte[] buffer, Key key) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
Cipher rsa;
rsa = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
rsa.init(Cipher.DECRYPT_MODE, key, new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT));
return rsa.doFinal(buffer);
}

.NET

var encryptedBytes = publicKey.Encrypt(bytesToEncrypt, RSAEncryptionPadding.OaepSHA256);

关于.net - 无法在 .NET 中解密使用 RSA/ECB/OAEPWithSHA-256AndMGF1Padding 在 Java 中加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61665435/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com