Add asymetric encryption
This commit is contained in:
parent
226e882e99
commit
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;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
99
src/main/java/systems/brn/chatencryptor/SecureChat.java
Normal file
99
src/main/java/systems/brn/chatencryptor/SecureChat.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
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.Base64;
|
||||||
|
|
||||||
|
public class SecureChat implements ClientModInitializer {
|
||||||
|
|
||||||
|
private PublicKey publicKey;
|
||||||
|
private PrivateKey privateKey;
|
||||||
|
private Cipher encryptingCipher = null;
|
||||||
|
private Cipher decryptingCipher = null;
|
||||||
|
|
||||||
|
private void initKeys() {
|
||||||
|
KeyPairGenerator kpg = null;
|
||||||
|
try {
|
||||||
|
kpg = KeyPairGenerator.getInstance("RSA");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
kpg.initialize(1024);
|
||||||
|
KeyPair kp = kpg.genKeyPair();
|
||||||
|
publicKey = kp.getPublic();
|
||||||
|
privateKey = kp.getPrivate();
|
||||||
|
|
||||||
|
try {
|
||||||
|
encryptingCipher = Cipher.getInstance("RSA");
|
||||||
|
decryptingCipher = Cipher.getInstance("RSA");
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (NoSuchPaddingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
encryptingCipher.init(Cipher.ENCRYPT_MODE, publicKey);
|
||||||
|
decryptingCipher.init(Cipher.DECRYPT_MODE, privateKey);
|
||||||
|
} catch (InvalidKeyException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
if(message_content.startsWith("BRNCrypt:")){
|
||||||
|
try {
|
||||||
|
String strippedMessage = message_content.replace("BRNCrypt:", "");
|
||||||
|
byte[] decodedMessage = Base64.getDecoder().decode(strippedMessage);
|
||||||
|
String decryptedMessage = new String(decryptingCipher.doFinal(decodedMessage));
|
||||||
|
assert sender != null;
|
||||||
|
String outputMessage = "{" + sender.getName() + "} " + decryptedMessage;
|
||||||
|
MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.of(outputMessage));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (IllegalBlockSizeException | BadPaddingException e){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String encryptChatMessage(String message) {
|
||||||
|
encryptingCipher.update(message.getBytes(StandardCharsets.UTF_8));
|
||||||
|
String encodedMessage = null;
|
||||||
|
try {
|
||||||
|
encodedMessage = Base64.getEncoder().withoutPadding().encodeToString(encryptingCipher.doFinal());
|
||||||
|
} catch (IllegalBlockSizeException | BadPaddingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
return "BRNCrypt:" + 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": {
|
||||||
|
Loading…
Reference in New Issue
Block a user