Cryptography

# Cryptography for the HP-41

Overview

1°)  Coding & Decoding
2°)  Storing Alpha Strings

-"CYPHER" allows to code and decode a text that has been stored into data registers by groups of 1 to 6 characters.
-The key is simply a random seed. The same one is used for coding and decoding.
-X-Functions module is required.
-A routine is also listed to store alpha strings into contiguous registers.

-"PASS" is a short program to create a password of a given length.

1°)  Coding & Decoding

Data Registers:            R00 to R03: temp                        ( Registers Rbb thru Ree are to be initialized before executing "CYPHER" )

•  Rbb  •  Rbb+1  ...............  •  Ree = the message     bbb > 003     ( R03 = bbb.eee )

>>> When the program stops, the coded message has replaced the original  ( or vice versa )

Flag:   CF 01 to code a message
SF 01 to decode a message

Subroutines: /

 01  LBL "CYPHER" 02  STO 00 03  X<>Y 04  STO 01 05  STO 03 06  255 07  STO 02 08  LBL 01 09  CLA 10  ARCL IND 01  11  ALENG 12  LBL 02 13  ATOX 14  RCL 00 15  R-D 16  FRC 17  STO 00 18  RCL 02             19  * 20  INT 21  FS? 01 22  CHS 23  + 24  RCL 02 25  MOD 26  X=0? 27  X<> L 28  XTOA 29  X<>Y 30  DSE X 31  GTO 02 32  ASTO IND 01 33  ISG 01 34  GTO 01 35  RCL 03             36  CLA 37  END

( 61 bytes )

 STACK INPUTS OUTPUTS Y bbb.eee / X r bbb.eee

where  bbb.eee  is the comtrol number of the message registers  ( bbb > 003 )
and         r        is the key

Example:

-You have stored

"MYNAME"     in register   R11
"ISBOND"       in register   R12
"JAMES "         in register   R13
"BOND"           in register   R14

-If your key is  r = 1  ( a more sophisticated key is recommended... )

CF 01   11.014   ENTER^
1      XEQ "CYPHER"  >>>>  11.014                 --- Execution time = 17s ---

-The coded message is now in registers R11 thru R14 ( many of the characters are displayed as starbursts )

-To decode this message:

SF 01   11.014   ENTER^
1           R/S      >>>>   11.014    and the original alpha strings are in R11 to R14 again.

Notes:

-For a 600 character message ( stored in 100 registers ), execution time = 7mn40s.
-We must avoid the null character since it disappears when shifted into the leftmost position.
-Otherwise, all the characters with an ASCII code from 1 to 255 are allowed.
-"CYPHER" uses the random number generator  R-D  FRC , so choose r so that  180*r/PI is not an integer.
-Using this program several times with several keys could produce an almost unbreakable encryption.

2°) Storing Alpha Strings

-Line 22 is one space.
-Lile 24 is  append  ?

 01  LBL "AIN"     02  ENTER^ 03  AON 04  1 05  ST- Y 06  GTO 02 07  LBL 01 08  ISG Z 09  CLX 10  ASTO IND Z 11  ASHF 12  CLX 13  ALENG 14  X#0? 15  GTO 01 16  SIGN 17  + 18  LBL 02 19  RCLFLAG  20  FIX 0 21  CF 29 22  " " 23  ARCL Y 24  "~?" 25  STOFLAG    26  STOP 27  FS?C 23 28  GTO 01 29  AOFF 30  RDN 31  CLX 32   E3 33  / 34  + 35  CLA  36  END

( 61 bytes )

 STACK INPUT OUTPUT X bbb bbb.eee

Example:   You want to store the confidential message:   "THE GARDEN PEAS ARE SIMMERING IN THE SAUCEPAN"   into registers R00 , R01 , .....

0  XEQ "AIN"                           the HP-41 displays  1?   ( the alpha keyboard is activated - line 03 )  key in:
"THE GARDEN PEAS ARE SIMM"      you hear a TONE since there are now 24 characters in the alpha "register".
press  R/S                               the HP-41 displays  2?   key in:
"ERING IN THE SAUCEPAN"
press R/S                                the HP-41 displays  3?
simply press R/S without any entry     the HP-41  returns the control number  0.007

-Your message has been stored into registers R00 thru R07

"PASS" takes an integer N in X-register and displays a password of N characters

-If F00 is clear, all characters between 0 and Z plus a b c d e  may be used
-If F00 is set, only numbers between 0 and 9 and letters between A and Z are used

Data Register:   R00 = N , N-1 , N-2 , ....... , 1 , 0
Flag:  F00
Subroutine:  RAND  ( M-Code routine listed in "Random Number Generators for the HP-41" )

 01 LBL "PASS"  02 " "  03 STO 00  04 LBL 01  05 RAND  06 FC? 00 07 47  08 FS? 00          09 36  10 *  11 INT  12 48 13 +  14 FC? 00         15 91  16 FS? 00  17 58  18 X>Y? 19 GTO 00        20 CLX  21 7  22 FC? 00  23 DSE X  24 +  25 ENTER 26 LBL 00          27 RDN  28 XTOA  29 DSE 00  30 GTO 01  31 AVIEW  32 END

( 58 bytes / SIZE 001 )

 STACK INPUT OUTPUT X N /

Where N = Number of characters

Note:

-The M-Code routine RAND may be replaced by another RNG.
-For example, replace

line 29 by  DSE 01
line 05 by  RCL 00  R-D  FRC  STO 00
line 03 by  STO 01

and initialize R00 before executing "PASS"