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
|