Nemrég beszélgettünk a titkosírás és a HP-49g+/50g kapcsolatáról. A beszélgetést ott fejeztük be hogy nem is lenne nehéz írni egy kódoló-dekódoló programot.
A beszélgetés:
https://groups.google.com/group/szamologep/browse_thread/thread/eed3e04c5b0c5334/b88b496c708df910?hl=hu&
A Tolosa által talált cikk az RSA rendszerű titkosírásról.
http://matek.fazekas.hu/portal/kutatomunkak/codes/codesm.html
Gondolkoztam a dolgon és megpróbáltam programot írni egy szöveg kódolására és a kód visszafejtésére. Mivel a HP-n sok minden "előre le van programozva", nem lett hosszú a 2 program.
I. A kulcsok meghatározása:
=====================
1. Választok 2 prímszámot. Pl. p= 13 és q= 23.
2. Ezek szorzata lesz a Modulo a CAS menüben. n=13*23= 299
3. Kiszámítom k-t úgy hogy MOD(k, (p-1)*(q-1))= 1 legyen.
(13-1)*(23-1)= 264
k=264+1= 265
4. K-t felbontom 2 egész szám szorzatára. Pl: 5*53= 265
( FACTOR(265) )
Ez a 2 szám lesz a kódoló és dekódoló kulcs.
D= 53 (decoding, titkos)
E= 5 (encoding, közzétett)
Vagyis a közzétett kulcs: n= 299 és E= 5.
A titkos kulcs: D= 53
A n= p*q azért kellett hogy 299 legyen, mert feltétel hogy az üzenet n-nél kisebb számok sorozata kell hogy legyen. Ha betűk számkódolása az ASCII kódjuk alapján történik, ennek legnagyobb értéke 255 lesz, ez kisebb mint n= 265.
II. Kódolás.
========
Bemenet: Egy két idézőjel közti szöveg.
Kimenet: Egy lista a kódolt számsorral.
<< DUPDUP SIZE S ->
<< S 1 - 1 SWAP
FOR N
NUM SWAP TAIL DUP
NEXT
DROP NUM S ->LIST
>>
299 MODSTO 5 POWMOD
13 MODSTO
>>
A program a szöveg karaktereinek számát "S" lokális változóba teszi (SIZE).
A FOR ciklus S-1 -szer fut le.
A szöveg első karakterét ASCII kóddá alakítja (NUM) és a szövegből kivonja az első karaktert. (TAIL)
A ciklus utáni rész az egyik fölösleges utolsó karaktert dobja, a másikat ASCII kóddá alakítja, és az összes számmá alakított betűt egy S méretű listába teszi. (Szóljatok ha megint túl zavaros! :-)
Aztán: 299-es Modulo beállítása (MODSTO), a maradékos hatványozás elvégzése a listán, majd Modulo 13 vissza.
III. Dekódolás.
==========
Bemenet: Lista a kódolt számsorral.
Kimenet: A visszafejtett szöveg.
<< 299 MODSTO 53 POWMOD 13 MODSTO
CHR ΣLIST >>
Hát ez ennyi.
299-es Modulo, hatványozás 53-al, 13-as Modulo, a visszafejtett ASCII lista betűlistává alakítása (CHR), majd a listában lévő karakterek { "A" "B" } összeadása szöveggé egyetlen utasítással (ΣLIST !!!)
Jók a gép listán végzett utasításai (hatványozás, összeadás) amik végül is gyárilag megírt ciklusok. Ezzel együtt a program nem túl gyors. Egy közepes mondaton kb. 3 másodpercig rágódik, de még nem mértem meg pontosan. Az n= 299 ellenére az ékezetes betűket nem igazán értékeli. :-(
Szóval még nyers a dolog (piszkozat) de gondoltam megmutatom. Az esetleges észrevételeket,ötleteket szívesen veszem. Valamint válaszolok ha van valamilyen kérdés.