У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать дешифрование. Логика шифрования в .net была реализована для отражения подхода, используемого в коде Java. Однако во время дешифрования на стороне Java мы встречаемся с ошибкой «недействительным Mac» .
код Java для шифрования:
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать дешифрование. Логика шифрования в .net была реализована для отражения подхода, используемого в коде Java. Однако во время дешифрования на стороне Java мы встречаемся с ошибкой «недействительным Mac» . код Java для шифрования: [code]package encrypt;
String privateKey = "{{PRIVATE KEY}}"; IESParameterSpec iesParamSpec = new IESParameterSpec(null, null,256); cipher.init(2, getDecryptedPrivateKey(privateKey), iesParamSpec); return new String(cipher.doFinal(Base64.getDecoder().decode(input.getBytes()))); } } < /code> Я использовал аналогичную логику шифрования в C#, которая используется в фрагменте кода Java.using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using NSec.Cryptography; using System.Text; using System.Text.Json; using System.Security.Cryptography; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Signers; using Org.BouncyCastle.OpenSsl; using System.Text.RegularExpressions; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Agreement; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Macs; using Org.BouncyCastle.Security; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.X9; using Org.BouncyCastle.Crypto.EC; using Org.BouncyCastle.Asn1.Anssi; using Org.BouncyCastle.Asn1.Nist; using Org.BouncyCastle.Asn1.TeleTrust; using Org.BouncyCastle.Math.EC; using Org.BouncyCastle.Asn1.Sec; using Org.BouncyCastle.Asn1.X509; using System.Security.Cryptography.X509Certificates; using Org.BouncyCastle.Bcpg.OpenPgp;
namespace BharatConnectEncryption;
public class Encryption_Demo { private readonly ILogger _logger;
public Encryption_Demo(ILogger logger) { _logger = logger; }
var response = req.CreateResponse(System.Net.HttpStatusCode.OK); await response.WriteStringAsync(encrypted); return response; } catch (Exception ex) { var response = req.CreateResponse(System.Net.HttpStatusCode.InternalServerError); await response.WriteStringAsync($"There is some error. The reason is : {ex.Message}"); return response; } }
public static ECPublicKeyParameters LoadPublicKeyFromPem(string pem) { using var reader = new StringReader(pem); var pemReader = new PemReader(reader); var keyObject = pemReader.ReadObject();
if (keyObject is ECPublicKeyParameters pubKey) return pubKey;
if (keyObject is SubjectPublicKeyInfo info) return (ECPublicKeyParameters)PublicKeyFactory.CreateKey(info);
throw new Exception("Unsupported public key format"); }
public static class ECIESEncryptionUtil { // Encrypt using ECIESwithSHA512/NONE/NoPadding public static string Encrypt(string plainText, ECPublicKeyParameters recipientPublicKey) { var ecParams = recipientPublicKey.Parameters; var random = new SecureRandom();
// Generate ephemeral key pair var keyGen = new ECKeyPairGenerator(); keyGen.Init(new ECKeyGenerationParameters(ecParams, random)); AsymmetricCipherKeyPair ephKp = keyGen.GenerateKeyPair();
var iesEngine = new IesEngine( new ECDHBasicAgreement(), new Kdf2BytesGenerator(new Sha512Digest()), new HMac(new Sha512Digest()) );
var derivation = new byte[0]; var encoding = new byte[0];
var iesParams = new IesWithCipherParameters(derivation, encoding, 256, 512); iesEngine.Init(true, ephKp.Private, recipientPublicKey, iesParams);
// Prepend ephemeral public key byte[] ephPublicBytes = ((ECPublicKeyParameters)ephKp.Public).Q.GetEncoded(false); byte[] result = new byte[ephPublicBytes.Length + ciphertext.Length]; Array.Copy(ephPublicBytes, 0, result, 0, ephPublicBytes.Length); Array.Copy(ciphertext, 0, result, ephPublicBytes.Length, ciphertext.Length);
return Convert.ToBase64String(result); } } [/code] После генерации зашифрованной строки из C# Когда мы используем строку для дешифрования из кода Java, мы получаем ошибку как "Invalid Mac" .
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать...
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать...
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать...
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать...
У нас есть целевая кодовая база Java, ответственную за расшифровку входящей полезной нагрузки. Полезная нагрузка шифруется в рамках изолированной функции Azure .NET, прежде чем отправлять в конечную точку, где код Java пытается расшифровать...