miru/src/lib/modules/crypt.ts
2025-05-22 16:04:25 +02:00

52 lines
1.6 KiB
TypeScript

import { arr2hex, arr2text, bin2hex, hex2arr, hex2bin, text2arr } from 'uint8-util'
// could use a simple XOR encryption/decryption but meh, some1 could easily brute force it
const key = new Uint8Array([104, 97, 121, 97, 115, 101, 45, 111, 118, 101, 114, 45, 97, 108, 108, 45, 251, 249, 0, 204, 242, 221, 119, 44, 147, 27, 83, 227, 225, 179, 149, 80, 70, 163, 58, 97, 201, 1, 10, 33, 78, 172, 195, 239, 171, 119, 51, 199, 127, 248, 221, 31, 90, 114, 200, 255, 252, 158, 158, 57, 245, 153, 44, 126, 130, 232, 230, 192, 0, 223, 204, 137, 211, 115, 33, 42, 68, 227, 65, 161, 17, 116, 138, 195, 51, 51, 181, 183, 124, 119, 161, 74, 202, 21, 182, 195, 134, 198, 191, 182, 223, 205, 60, 175, 207, 223, 232, 94, 133, 70, 10, 127, 100, 170, 109, 22])
const derived = (async () => {
const keyMaterial = await crypto.subtle.importKey(
'raw',
key,
'PBKDF2',
false,
['deriveKey']
)
return await crypto.subtle.deriveKey(
{
name: 'PBKDF2',
salt: key,
iterations: 100000,
hash: 'SHA-256'
},
keyMaterial,
{
name: 'AES-GCM',
length: 256
},
false,
['encrypt', 'decrypt']
)
})()
export async function encryptMessage (message: string) {
return hex2bin(arr2hex(new Uint8Array(await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: key
},
await derived,
text2arr(message)
))))
}
export async function decryptMessage (encryptedMessage: string) {
return arr2text(await crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: key
},
await derived,
hex2arr(bin2hex(encryptedMessage))
))
}