Update: Full E2EE + Scripts
This commit is contained in:
@@ -9,35 +9,33 @@ public static class E2EeHelper
|
||||
{
|
||||
using var rsa = RSA.Create(2048);
|
||||
|
||||
var publicKey = Convert.ToBase64String(rsa.ExportSubjectPublicKeyInfo());
|
||||
var privateKey = Convert.ToBase64String(rsa.ExportPkcs8PrivateKey());
|
||||
|
||||
return (publicKey, privateKey);
|
||||
return (
|
||||
Convert.ToBase64String(rsa.ExportSubjectPublicKeyInfo()),
|
||||
Convert.ToBase64String(rsa.ExportPkcs8PrivateKey())
|
||||
);
|
||||
}
|
||||
|
||||
public static EncryptedMessagePayload EncryptForRecipient(string plainText, string recipientPublicKeyBase64)
|
||||
public static EncryptedPayload EncryptForRecipient(string plainText, string recipientPublicKeyBase64)
|
||||
{
|
||||
var aesKey = RandomNumberGenerator.GetBytes(32);
|
||||
var nonce = RandomNumberGenerator.GetBytes(12);
|
||||
var plainBytes = Encoding.UTF8.GetBytes(plainText);
|
||||
var cipherBytes = new byte[plainBytes.Length];
|
||||
var tag = new byte[16];
|
||||
byte[] aesKey = RandomNumberGenerator.GetBytes(32);
|
||||
byte[] nonce = RandomNumberGenerator.GetBytes(12);
|
||||
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
|
||||
byte[] cipherBytes = new byte[plainBytes.Length];
|
||||
byte[] tag = new byte[16];
|
||||
|
||||
using (var aes = new AesGcm(aesKey, 16))
|
||||
{
|
||||
aes.Encrypt(nonce, plainBytes, cipherBytes, tag);
|
||||
}
|
||||
|
||||
var recipientPublicKey = Convert.FromBase64String(recipientPublicKeyBase64);
|
||||
byte[] encryptedKey;
|
||||
|
||||
using (var rsa = RSA.Create())
|
||||
{
|
||||
rsa.ImportSubjectPublicKeyInfo(recipientPublicKey, out _);
|
||||
rsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(recipientPublicKeyBase64), out _);
|
||||
encryptedKey = rsa.Encrypt(aesKey, RSAEncryptionPadding.OaepSHA256);
|
||||
}
|
||||
|
||||
return new EncryptedMessagePayload
|
||||
return new EncryptedPayload
|
||||
{
|
||||
CipherText = Convert.ToBase64String(cipherBytes),
|
||||
Nonce = Convert.ToBase64String(nonce),
|
||||
@@ -46,34 +44,32 @@ public static class E2EeHelper
|
||||
};
|
||||
}
|
||||
|
||||
public static string DecryptForRecipient(EncryptedMessagePayload payload, string recipientPrivateKeyBase64)
|
||||
public static string DecryptForRecipient(EncryptedPayload payload, string recipientPrivateKeyBase64)
|
||||
{
|
||||
var encryptedKey = Convert.FromBase64String(payload.EncryptedKey);
|
||||
var privateKey = Convert.FromBase64String(recipientPrivateKeyBase64);
|
||||
|
||||
byte[] aesKey;
|
||||
|
||||
using (var rsa = RSA.Create())
|
||||
{
|
||||
rsa.ImportPkcs8PrivateKey(privateKey, out _);
|
||||
aesKey = rsa.Decrypt(encryptedKey, RSAEncryptionPadding.OaepSHA256);
|
||||
rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(recipientPrivateKeyBase64), out _);
|
||||
aesKey = rsa.Decrypt(Convert.FromBase64String(payload.EncryptedKey), RSAEncryptionPadding.OaepSHA256);
|
||||
}
|
||||
|
||||
var nonce = Convert.FromBase64String(payload.Nonce);
|
||||
var tag = Convert.FromBase64String(payload.Tag);
|
||||
var cipherBytes = Convert.FromBase64String(payload.CipherText);
|
||||
var plainBytes = new byte[cipherBytes.Length];
|
||||
byte[] plainBytes = new byte[Convert.FromBase64String(payload.CipherText).Length];
|
||||
|
||||
using (var aes = new AesGcm(aesKey, 16))
|
||||
{
|
||||
aes.Decrypt(nonce, cipherBytes, tag, plainBytes);
|
||||
aes.Decrypt(
|
||||
Convert.FromBase64String(payload.Nonce),
|
||||
Convert.FromBase64String(payload.CipherText),
|
||||
Convert.FromBase64String(payload.Tag),
|
||||
plainBytes
|
||||
);
|
||||
}
|
||||
|
||||
return Encoding.UTF8.GetString(plainBytes);
|
||||
}
|
||||
}
|
||||
|
||||
public class EncryptedMessagePayload
|
||||
public class EncryptedPayload
|
||||
{
|
||||
public required string CipherText { get; set; }
|
||||
public required string Nonce { get; set; }
|
||||
|
||||
Reference in New Issue
Block a user