Compare commits

...

2 Commits

Author SHA1 Message Date
22a7d78152 The encoding is broken now 2024-04-05 15:49:26 +02:00
7d0e773196 Add asymetric encryption 2024-04-05 14:52:37 +02:00
4 changed files with 92 additions and 54 deletions

View File

@@ -1,31 +0,0 @@
package systems.brn.chatencryptor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent;
import java.util.Base64;
public class ChatDecryptorClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
// Register event listener for ClientTickEvents.END_CLIENT_TICK
ClientReceiveMessageEvents.ALLOW_CHAT.register((message, signedMessage, sender, params, receptionTimestamp) -> {
TranslatableTextContent content = (TranslatableTextContent) message.getContent();
String message_content = content.getArg(1).getString();
if(message_content.startsWith("BRNCrypt:")){
String strippedMessage = message_content.replace("BRNCrypt:", "");
String decodedMessage = new String(Base64.getDecoder().decode(strippedMessage));
assert sender != null;
String outputMessage = "Decoded from " + sender.getName() + ":" + decodedMessage;
MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of(outputMessage));
return false;
}
return true;
});
});
}
}

View File

@@ -1,21 +0,0 @@
package systems.brn.chatencryptor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class ChatEncryptorClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
// Register event listener for ClientTickEvents.END_CLIENT_TICK
ClientSendMessageEvents.MODIFY_CHAT.register(message -> {
String encodedMessage = Base64.getEncoder().withoutPadding().encodeToString(message.getBytes(StandardCharsets.UTF_8));
return "BRNCrypt:" + encodedMessage;
});
});
}
}

View File

@@ -0,0 +1,91 @@
package systems.brn.chatencryptor;
import com.mojang.authlib.GameProfile;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents;
import net.minecraft.client.MinecraftClient;
import net.minecraft.network.message.MessageType;
import net.minecraft.network.message.SignedMessage;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent;
import org.jetbrains.annotations.Nullable;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.time.Instant;
import java.util.Arrays;
public class SecureChat implements ClientModInitializer {
private PublicKey publicKey;
private PrivateKey privateKey;
private void initKeys() {
KeyPairGenerator kpg;
try {
kpg = KeyPairGenerator.getInstance("RSA");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
kpg.initialize(512);
KeyPair kp = kpg.genKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();
}
private boolean decryptChatMessage(Text message, @Nullable SignedMessage signedMessage, @Nullable GameProfile sender, MessageType.Parameters params, Instant receptionTimestamp) {
TranslatableTextContent content = (TranslatableTextContent) message.getContent();
String message_content = content.getArg(1).getString();
String player_name = content.getArg(0).getString();
if(message_content.startsWith("®") && message_content.endsWith("®")){
try {
String strippedMessage = message_content.replace("®", "");
byte[] decodedMessage = strippedMessage.getBytes(java.nio.charset.StandardCharsets.UTF_16);
byte[] unpaddedMessage = Arrays.copyOfRange(decodedMessage, 2, decodedMessage.length);
Cipher decryptingCipher = Cipher.getInstance("RSA");
decryptingCipher.init(Cipher.DECRYPT_MODE, privateKey);
decryptingCipher.update(unpaddedMessage);
String decryptedMessage = new String(decryptingCipher.doFinal());
String outputMessage = "{" + player_name + "} " + decryptedMessage;
MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of(outputMessage));
return false;
}
catch (IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException | NoSuchPaddingException |
InvalidKeyException e){
return true;
}
}
return true;
}
private String encryptChatMessage(String message) {
String encodedMessage;
try {
Cipher encryptingCipher = Cipher.getInstance("RSA");
encryptingCipher.init(Cipher.ENCRYPT_MODE, publicKey);
encryptingCipher.update(message.getBytes(StandardCharsets.UTF_8));
byte[] encryptedMessage = encryptingCipher.doFinal();
encodedMessage = new String(encryptedMessage, java.nio.charset.StandardCharsets.UTF_16);
} catch (IllegalBlockSizeException | BadPaddingException | InvalidKeyException | NoSuchPaddingException |
NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
return '®' + encodedMessage + '®';
}
@Override
public void onInitializeClient() {
ClientLifecycleEvents.CLIENT_STARTED.register(client -> {
// Register event listener for ClientTickEvents.END_CLIENT_TICK
initKeys();
ClientReceiveMessageEvents.ALLOW_CHAT.register(this::decryptChatMessage);
ClientSendMessageEvents.MODIFY_CHAT.register(this::encryptChatMessage);
});
}
}

View File

@@ -16,8 +16,7 @@
"environment": "client", "environment": "client",
"entrypoints": { "entrypoints": {
"client": [ "client": [
"systems.brn.chatencryptor.ChatEncryptorClient", "systems.brn.chatencryptor.SecureChat"
"systems.brn.chatencryptor.ChatDecryptorClient"
] ]
}, },
"depends": { "depends": {