Hello Dan and/or others...

Some questions and remarks below.

I spent (wasted?) a lot of time yesterday and again today, looking
at mix and the rest of the stuff about Isaac,  both at Rosetta,  and
at the author's, Rob Jenkins',  site:
http://www.burtleburtle.net/bob/rand/isaacafa.html

The author's own listing of his 32-bit "readable C" code is similar to
the first part of the Rosetta C listing,  although the Rosetta listing
has several extras,  from iSeed() downwards,  including a different
main().

The core of the whole thing is described as algorithm 1.1 in Amasson:
http://eprint.iacr.org/2006/438.pdf,
and is quite concisely coded (as isaac()) in both listings. Amasson doesn't
mention mix.

Jenkins' site also includes a presumably non-readable C listing, and
a 64-bit version.

Q0 What is the difference between 32 b.   , 33 b.  and 34 b.  for left
shift, ie with positive x?

Q1 Is mix truly a part of the encoding or not?

Q2 Is it sufficient, in J, to start of with
   256 {.a. i. <string message>  ?
  I think that means that each byte becomes a word with 4 (or 8) bytes,
although this encoding should leave the upper 3 (or 7) bytes at zero.
I decode the results with output { a.  .  I don't understand C (nor the
other languages) well enough to see how they're doing it.

Q3 My pc's are 64-bit.  The implementation appears to work with
characters encoded into (computer) words. Correct?

Q4 I've achieved a working version in the sense that a verb
can encipher and decipher the message,  but the ciphers are
apparently wrong.  I'm just printing them as integers, but
they seem to have no relation to the samples:

   isaacrosetta''  NB.my usual apologies re word-wrap, LF etc

Message: a Top Secret secret

Key: this is my secret key

XOR encr:3 66 54 13 18 66 49 7 1 16 7 22 66 17 7 1 16 7 22

XOR decr:a Top Secret secret

MOD encr:68 98 55 82 83 98 54 72 70 85 72 87 98 86 72 70 85 72 87

MOD decr:a Top Secret secret


The message has 19 characters,  while the required encryptions each
have 38 hex-digits, ie 2 per byte. The hex sample for MOD is
   734270227D36772A783B4F2A5F206266236978

My version of mix is ok,  but not worth reproducing here and trying your
patience.  It produces the same results on simple input as Raul's explicit
verb, so I'll assume it's not at fault.

I suspect the problem is associated with my Q2 above, but it might easily
be that I've got the core Isaac code wrong,  or am doing the wrong number
of mixes, etc.  It can't be all wrong though, as the plaintext is recovered
correctly,  both for the example,  and for much longer inputs.

I could provide the script,  but it's pretty long, though not as long as
the C code.

Any ideas?

Mike



On 05/09/2015 03:55, Dan Bron wrote:
Periodically I review the list of open J tasks on RosettaCode [1]. Today I came 
across an obscure but (if you believe the task description) meritorious cipher, 
called ISAAC ("Indirection, Shift, Accumulate, Add, and Count”).

I understand the basic concepts of cryptography, but am generally unversed in 
the practical details of implementation. In other words: at the moment, I’m 
blindly transliterating the C implementation (marked as canonical) to J, hewing 
as closely to the source material as possible, loops and all.

Which, of course, results in some damn ugly J.  Take, for example, this C 
preprocessor macro, which I’ve dutifully transliterated as in the post-script.

#define mix(a,b,c,d,e,f,g,h) \
{ \
    a^=b<<11; d+=a; b+=c; \
    b^=c>>2;  e+=b; c+=d; \
    c^=d<<8;  f+=c; d+=e; \
    d^=e>>16; g+=d; e+=f; \
    e^=f<<10; h+=e; f+=g; \
    f^=g>>4;  a+=f; g+=h; \
    g^=h<<8;  b+=g; h+=a; \
    h^=a>>9;  c+=h; a+=b; \
}

Can you write this function in idiomatic, perhaps even elegant, J?  Extra 
brownie points for something along the lines of f/ a,b,c,d,e,f,g,h ,

If it gives you a jumpstart, here is the pattern of variable names, as well as 
the bitshift direction and degree:

abdabc < 11
bcebcd > 2
cdfcde < 8
degdef > 16
efhefg < 10
fgafgh > 4
ghbgha < 8
hachab > 9

Expressed as left-hand arguments to |.!.0, the bitshifts are 11 _2 8 _16 10 _4 
8 _9 .

And the variable name matrix, expressed as indices into ‘abcdefgh’ is:

0 1 3 0 1 2
1 2 4 1 2 3
2 3 5 2 3 4
3 4 6 3 4 5
4 5 7 4 5 6
5 6 0 5 6 7
6 7 1 6 7 0
7 0 2 7 0 1

Which pattern can be expressed as   0 1 3  0 1 2 (|."0 1) i.8  if you conceive 
of it column-wise, or  0 1 3  0 1 2 (8 | +/~) i.8  if row-wise. Either way, the 
salient structure appears to be  0 1 3  0 1 2  .


-Dan

[1] Tasks on RosettaCode with no J implementation:
http://rosettacode.org/wiki/Reports:Tasks_not_implemented_in_J <http://rosettacode.org/wiki/Reports:Tasks_not_implemented_in_J>
[2]  The “wash shuffle” (which Wikipedia calls the “Corgi shuffle”) is that 
basic, no-frills move you see at the cheap tables in Atlantic City: the dealer 
simply spreads all the cards face down on the table and slides them all around 
and over each other. Not pretty, but effective, and less susceptible to 
sleight-of-hand cheating.
      https://en.wikipedia.org/wiki/Shuffling#Corgi_shuffle  
<https://en.wikipedia.org/wiki/Shuffling#Corgi_shuffle>

PS:  Here is a direct transliteration, but be WARNED: I haven’t gotten the 
overall ISAAC cypher to produce the correct outputs yet, so this is untested 
and may be incorrect.


NB. ISAAC operates on 32-bit ints, meaning b. will break it on 64-bit systems
bww =: (32#2)&#:
hlfUnd =: 2 : 'v^:_1@:(u v)’

bwXor =: ~:&.bww
bwShift =: |.!.0 hlfUnd bww

mix =: verb define
'a b c d e f g h'=.y

NB. a^=b<<11; d+=a; b+=c;
a =. a bwXor 11 bwShift b
d =. d + a
b =. b + c

NB. b^=c>>2; e+=b; c+=d;
b =. b bwXor _2 bwShift c
e =. e + b
c =. c + d

NB. c^=d<<8; f+=c; d+=e;
c =. c bwXor 8 bwShift d
f =. f + c
d =. d + e

NB. d^=e>>16; g+=d; e+=f;
d =. d bwXor _16 bwShift e
g =. g + d
e =. e + f

NB. e^=f<<10; h+=e; f+=g;
e =. e bwXor 10 bwShift f
h =. h + e
f =. f + g

NB. f^=g>>4; a+=f; g+=h;
f =. f bwXor _4 bwShift g
a =. a + f
g =. g + h

NB. g^=h<<8; b+=g; h+=a;
g =. g bwXor 8 bwShift h
b =. b + g
h =. h + a

NB. h^=a>>9; c+=h; a+=b;
h =. h bwXor _9 bwShift a
c =. c + h
a =. a + b

".&> ;: 'a b c d e f g h'
)



----------------------------------------------------------------------
For information about J forums seehttp://www.jsoftware.com/forums.htm


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to