Я участвую в разработке двух системных коммуникационных проектов. С другой стороны, система на основе Java требует, чтобы передаваемый контент был зашифрован с использованием AES. Наша система в настоящее время основана на .NET Framework 7 (NET7). Я пытаюсь расшифровать содержимое другой стороны с помощью C#. Я попробовал реализовать алгоритм с помощью платформы BouncyCastle.Cryptography, пытаясь имитировать стиль кодирования Java, но, к сожалению, мне это не удалось. Я боролся с этой проблемой в течение нескольких дней и решил обратиться за помощью сюда.
Вот фрагмент реализации Java:
Я участвую в разработке двух системных коммуникационных проектов. С другой стороны, система на основе Java требует, чтобы передаваемый контент был зашифрован с использованием AES. Наша система в настоящее время основана на .NET Framework 7 (NET7). Я пытаюсь расшифровать содержимое другой стороны с помощью C#. Я попробовал реализовать алгоритм с помощью платформы BouncyCastle.Cryptography, пытаясь имитировать стиль кодирования Java, но, к сожалению, мне это не удалось. Я боролся с этой проблемой в течение нескольких дней и решил обратиться за помощью сюда. Вот фрагмент реализации Java: [code]import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.GCMParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; public class AESUtil { private static final String KEY_ALGORITHM_AES = "AES"; private static final String DEFAULT_CIPHER_ALGORITHM = "AES/GCM/NoPadding"; private static final String CHARSET = "UTF-8"; public static String aesEncrypt(String content, String encryptPass) { try { byte[] iv = new byte[12]; SecureRandom secureRandom = new SecureRandom(); secureRandom.nextBytes(iv); byte[] contentBytes = content.getBytes(CHARSET); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); GCMParameterSpec params = new GCMParameterSpec(128, iv); cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(encryptPass), params); byte[] encryptData = cipher.doFinal(contentBytes); assert encryptData.length == contentBytes.length + 16; byte[] message = new byte[12 + contentBytes.length + 16]; System.arraycopy(iv, 0, message, 0, 12); System.arraycopy(encryptData, 0, message, 12, encryptData.length); return Base64.getEncoder().encodeToString(message); } catch (Exception e) {
private static SecretKeySpec getSecretKey(String encryptPass) throws NoSuchAlgorithmException { KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM_AES); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(encryptPass.getBytes()); kg.init(128, secureRandom); SecretKey secretKey = kg.generateKey(); return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM_AES); } } [/code] Мне бы хотелось, чтобы код C#, который я пишу, обеспечивал взаимное шифрование и дешифрование с помощью версии Java