Compare commits
2 Commits
226e882e99
...
22a7d78152
Author | SHA1 | Date | |
---|---|---|---|
22a7d78152 | |||
7d0e773196 |
@@ -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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
91
src/main/java/systems/brn/chatencryptor/SecureChat.java
Normal file
91
src/main/java/systems/brn/chatencryptor/SecureChat.java
Normal 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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@@ -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": {
|
||||||
|
Reference in New Issue
Block a user