aboutsummaryrefslogtreecommitdiff
path: root/main.sts
blob: 8ed7f59f841387322a2f0801d7132e7b2feccaf9 (plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
module ia32/elf/begin.sts
module cipher.sts

[ sd 0 swap drop ]

defword checktext
    as checktext.length
    local checktext.text
        ; Count frequencies:
    ; 26 latin letters:
    0 0 0 0 0  0 0 0 0 0  0 0 0
    0 0 0 0 0  0 0 0 0 0  0 0 0 local checktext.fr
    checktext.length do 1 -
        dup checktext.text + @
        dup dup 'z' > 0 = swap 'a' < 0 = mul if
            dup 'z' swap - dup checktext.fr + @ + 1 swap !
        fi dup dup 'Z' > 0 = swap 'A' < 0 = mul if
            dup 'Z' swap - dup checktext.fr + @ + 1 swap !
        fi drop
    dup 0 = untilod drop
        ; Decide if text is real:
    1
        ; Remove frequencies from stack:
    sd sd sd sd sd  sd sd sd sd sd  sd sd sd
    sd sd sd sd sd  sd sd sd sd sd  sd sd sd
exit

defword keygen
    drop 31 32 33 3
exit

set_entry
    ; read file into stack
    0 do sys_read 0 = until
        swap 1 +
    od drop as length
    local ciphertext

    0 ; initial key is empty
    do
        ; generate next key to try
        keygen as keylen local key

        ; decipher text (length is the same as for ciphertext)
        keylen 1 - length do 1 -
            as textpos local pos
                textpos word_size mul ciphertext + @
                key
                keylen
                pos
            cipher
            swap textpos
        dup 0 = untilod drop drop
        local plaintext

        ; check deciphering attempt, exit if Ok
    length checktext dup until drop
        ; else remove the text from stack and place keylen back
        0 do dup length = until
            swap drop 1 +
        od drop keylen
    od as langcode

    ; output language
    langcode 1 = if
        'e' sys_write_err
        'n' sys_write_err
        'g' sys_write_err
        'l' sys_write_err
        'i' sys_write_err
        's' sys_write_err
        'h' sys_write_err
    fi langcode 2 = if
        'd' sys_write_err
        'u' sys_write_err
        't' sys_write_err
        'c' sys_write_err
        'h' sys_write_err
    fi langcode 3 = if
        'g' sys_write_err
        'e' sys_write_err
        'r' sys_write_err
        'm' sys_write_err
        'a' sys_write_err
        'n' sys_write_err
    fi langcode 4 = if
        'f' sys_write_err
        'r' sys_write_err
        'e' sys_write_err
        'n' sys_write_err
        'c' sys_write_err
        'h' sys_write_err
    fi langcode 5 = if
        's' sys_write_err
        'p' sys_write_err
        'a' sys_write_err
        'n' sys_write_err
        'i' sys_write_err
        's' sys_write_err
        'h' sys_write_err
    fi langcode 6 = if
        'i' sys_write_err
        't' sys_write_err
        'a' sys_write_err
        'l' sys_write_err
        'i' sys_write_err
        'a' sys_write_err
        'n' sys_write_err
    fi langcode eeeee = if
        'e' sys_write_err
        'r' sys_write_err
        'r' sys_write_err
        'o' sys_write_err
        'r' sys_write_err
    fi

    ; output text
    length do 1 -
        dup word_size mul plaintext + @ sys_write
    dup 0 = untilod
sys_exit

module ia32/elf/end.sts