File size: 1,289 Bytes
d76f93d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2200342
d76f93d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
export const CUSTOM_ALPHABET =
  "abcdefghijklmnopqrstuvwxyz" +
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
  "0123456789" +
  ".,;:=|!?()[]{}\"'-_/\\@#$%^&* "

const alphabetMap = new Map<string, number>()

for (let i = 0; i < CUSTOM_ALPHABET.length; i++) {
  alphabetMap.set(CUSTOM_ALPHABET[i], i + 1)
}

function getPos(char: string): number {
  const pos = alphabetMap.get(char)
  if (!pos) throw new Error(`Character "${char}" is missing in the alphabet`)
  return pos
}

function getChar(pos: number): string {
  return CUSTOM_ALPHABET[pos - 1]
}

export function encryptWithAlphabet(text: string, key: string): string {
  let result = ""
  const N = CUSTOM_ALPHABET.length

  for (let i = 0; i < text.length; i++) {
    const tPos = getPos(text[i])
    const kPos = getPos(key[i % key.length])

    let encPos = tPos + kPos
    if (encPos > N) encPos -= N

    result += getChar(encPos)
  }
  

  return result
}

export function decryptWithAlphabet(encrypted: string, key: string): string {
  let result = ""
  const N = CUSTOM_ALPHABET.length

  for (let i = 0; i < encrypted.length; i++) {
    const ePos = getPos(encrypted[i])
    const kPos = getPos(key[i % key.length])

    let decPos = ePos - kPos
    if (decPos <= 0) decPos += N

    result += getChar(decPos)
  }

  return result
}