Ich habe einen mit AES/GCM verschlüsselten Text aus der Bouncy Castle-Bibliothek von Java, den ich mit der C#-Bouncy CasJava

Java-Forum
Anonymous
 Ich habe einen mit AES/GCM verschlüsselten Text aus der Bouncy Castle-Bibliothek von Java, den ich mit der C#-Bouncy Cas

Post by Anonymous »

Ich habe einen Text, den ich mit dem AES/GCM-Dienstprogramm Bouncy Castle von Java verschlüssele.

Code: Select all

package com.stackoflow.symmetric_token_decryptor;

import static org.apache.commons.codec.binary.Hex.encodeHex;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.KeyGenerator;

import org.bouncycastle.util.encoders.Base64;
import org.springframework.security.crypto.encrypt.BouncyCastleAesGcmBytesEncryptor;
import org.springframework.security.crypto.encrypt.BytesEncryptor;

public class App
{
public static void main( String[] args ) throws Exception
{
String generatedKey = generateSymmetricKey();

System.out.println("generatedKey = " + generatedKey);

String encryptedToken = encrypt("abc", generatedKey);

System.out.println("encryptedToken = " + encryptedToken);

String plainToken = decryptToken(encryptedToken, generatedKey);

System.out.println(plainToken);
}

private static String generateSymmetricKey() throws NoSuchAlgorithmException {

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
Key key = keyGen.generateKey();

return new String(encodeHex(key.getEncoded()));
}

private static String encrypt(String text, String secretKey) {
BytesEncryptor encryptor = new BouncyCastleAesGcmBytesEncryptor("", secretKey);
return new String(Base64.encode(encryptor.encrypt(text.getBytes())), StandardCharsets.UTF_8);
}
}
Ausgabe:

Code: Select all

generatedKey = e4deeabbdfbf504f5a980bb7e4ae6b8e9cb8896cd5e64692e162a9691449c196
encryptedToken = 52nvbvyz2mEYBIb+grW5SNXplUufgeTtlVVOVOmhqRFvmeg=
Das Bouncy Castle AES/GCM-Dienstprogramm von Spring Framework verwendet standardmäßig 16 Byte IV.
pom.xml:

Code: Select all

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.stackoflow
symmetric-token-decryptor
0.0.1-SNAPSHOT
jar
symmetric-token-decryptor
http://maven.apache.org

UTF-8
17
${java.version}
${java.version}



org.springframework.security
spring-security-crypto
5.8.10


org.bouncycastle
bcprov-jdk18on
1.80


commons-codec
commons-codec
1.18.0



Ich muss den Chiffriertext in C# (.NET Core 3.1) entschlüsseln, wofür ich den folgenden Code verwende:

Code: Select all

using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace Symmetric_Decryption_AES_GCM_C_ {

class Program
{
static void Main(string[] args)
{
String encryptedToken = "52nvbvyz2mEYBIb+grW5SNXplUufgeTtlVVOVOmhqRFvmeg=";

String secretKey = "e4deeabbdfbf504f5a980bb7e4ae6b8e9cb8896cd5e64692e162a9691449c196";

Console.WriteLine(DecryptPayload(encryptedToken, secretKey));
}

private static string DecryptPayload(string base64EncryptedToken, string stringKey)
{
Console.WriteLine("----C# Decryption Details----");
byte[] encryptedToken = Convert.FromBase64String(base64EncryptedToken); // Converting the base64 string encrypted text to byte[]

byte[] key = Enumerable.Range(0, stringKey.Length / 2)
.Select(i => Convert.ToByte(stringKey.Substring(i * 2, 2), 16))
.ToArray(); // Converting hex encoded key to byte[]

int ivLength = 16;
int ciphertextTagLength = encryptedToken.Length - ivLength;

byte[] iv = new byte[ivLength];
byte[] ciphertextTag = new byte[ciphertextTagLength];

Buffer.BlockCopy(encryptedToken, 0, iv, 0, ivLength);
Buffer.BlockCopy(encryptedToken, ivLength, ciphertextTag, 0, ciphertextTagLength);

return DecryptWithGCM(ciphertextTag, key, iv);
}

private static string DecryptWithGCM(byte[] ciphertextTag, byte[] key, byte[] nonce)
{
var cipher = new GcmBlockCipher(new AesEngine());
cipher.Init(false, new AeadParameters(new KeyParameter(key), 128, nonce, null));

int outputSizeDecryptedData = cipher.GetOutputSize(ciphertextTag.Length);

byte[] decryptedBytes = new byte[outputSizeDecryptedData];

int processedBytes = cipher.ProcessBytes(ciphertextTag, 0, ciphertextTag.Length, decryptedBytes, 0);

cipher.DoFinal(decryptedBytes, processedBytes);

return Encoding.UTF8.GetString(decryptedBytes);
}
}
}
Dieser Entschlüsselungscode funktioniert gut, wenn ich einen Text in C# verschlüssele/entschlüssele, daher funktioniert der Code.
Aber wenn ich den verschlüsselten Text gebe, der aus Java-Code generiert wurde, erhalte ich

Mac-Prüfung in GCM fehlgeschlagen

Außerdem funktioniert der Java-Code auch gut, wenn ich nur in verschlüssele/entschlüssele Java

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post