aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--encrypt.sts19
-rw-r--r--main.sts51
2 files changed, 38 insertions, 32 deletions
diff --git a/encrypt.sts b/encrypt.sts
index a472e57..7762b3a 100644
--- a/encrypt.sts
+++ b/encrypt.sts
@@ -1,20 +1,13 @@
module ia32/elf/begin.sts
module cipher.sts
-defarr passwd 3
-
-defword encrypt
- top as pos
- do sys_read 0 = until
- passwd 3 pos cipher sys_write
- od drop
-exit
-
set_entry
- 31 passwd !
- 32 passwd 1 + !
- 33 passwd 2 + !
- 0 encrypt drop
+ 31 32 33 local password
+ 3 as passlen
+ passlen 1 - local pos
+ do sys_read 0 = until
+ password passlen pos cipher sys_write
+ od
sys_exit
module ia32/elf/end.sts
diff --git a/main.sts b/main.sts
index 8613909..906cbbb 100644
--- a/main.sts
+++ b/main.sts
@@ -1,6 +1,14 @@
module ia32/elf/begin.sts
module cipher.sts
+defword checktext
+ 1
+exit
+
+defword keygen
+ drop 31 32 33 3
+exit
+
set_entry
; read file into stack
0 do sys_read 0 = until
@@ -8,25 +16,30 @@ set_entry
od drop as length
local ciphertext
- ; -= MAIN LOOP BEGIN =- ;
- ; place password ontop of stack
- 31 32 33 local password
- 3 as passlen
-
- ; decipher text (length is the same as for ciphertext)
- passlen 1 - length do 1 -
- as pos local cipos
- pos word_size mul ciphertext + @
- password
- passlen
- cipos
- cipher
- swap pos
- dup 0 = untilod drop drop
- local plaintext
-
- ; todo: check deciphering attempt, exit if Ok
- ; -= MAIN LOOP END =- ;
+ 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 until
+ ; else remove the text from stack and place keylen back
+ 0 do dup length = until
+ swap drop 1 +
+ od drop keylen
+ od
; output text (todo: and language)
length do 1 -