2title = "3f: Scrambling"
10A core that contains arms that perform reversible scrambling operations.
11Used in the `@p` phonetic base.
25Scrambles a byte-string `pyn` by adding the current position to each
26byte, looking it up in an s-box, and then performing the XOR operation
27on the result, pushing it forward. The inverse of `wred`.
46 =+ mig=(zaft (xafo len (cut 3 [len 1] pyn)))
48 %- flop ^- (list [@ @])
54 =+ mog=(zyft :(mix mig (end 3 1 len) (cut 3 [len 1] pyn)))
62 > `@ux`(wren:un 'testing')
68 > `@da`(wred:un (wren:un ~2001.2.5))
77Unscrambles a byte-string `cry` by subtracting the current position from
78each byte, looking it up in an s-box, and performing the XOR operation
79on the result, pushing it forward. The inverse of `wren`.
98 =+ mig=(cut 3 [len 1] cry)
100 %- flop ^- (list [@ @])
101 :- [1 (xaro len (zart mig))]
106 =+ mog=(cut 3 [len 1] cry)
107 [[1 :(mix mig (end 3 1 len) (zyrt mog))] $(mig mog)]
114 > (wred:un 0x30.bf6a.b9fe.7d8f)
115 29.113.321.805.538.676
117 > `@t`(wred:un 0x30.bf6a.b9fe.7d8f)
120 > (wred:un (wren:un 200.038.426))
129Produces the sum of two atoms modulo 255, encoded as a nonzero byte. The inverse
145 ++ xafo |=([a=@ b=@] +((mod (add (dec b) a) 255)))
157 > (xafo:un 256 (xaro:un 256 20))
166Produces the sum of two atoms modulo 255, encoded as a nonzero byte. The inverse
182 ++ xaro |=([a=@ b=@] +((mod (add (dec b) (sub 255 (mod a 255))) 255)))
194 > (xaro:un 256 (xafo:un 256 20))
201Look up in 255 sub box
203Looks up a nonzero byte `a` in a substitution box with 255 values, producing a
204unique nonzero byte. The inverse of `zart`.
208`a` is an atom of one byte in length.
220 0xcc.75bc.86c8.2fb1.9a42.f0b3.79a0.92ca.21f6.1e41.cde5.fcc0.
221 7e85.51ae.1005.c72d.1246.07e8.7c64.a914.8d69.d9f4.59c2.8038.
222 1f4a.dca2.6fdf.66f9.f561.a12e.5a16.f7b0.a39f.364e.cb70.7318.
223 1de1.ad31.63d1.abd4.db68.6a33.134d.a760.edee.5434.493a.e323.
224 930d.8f3d.3562.bb81.0b24.43cf.bea5.a6eb.52b4.0229.06b2.6704.
225 78c9.45ec.d75e.58af.c577.b7b9.c40e.017d.90c3.87f8.96fa.1153.
226 0372.7f30.1c32.ac83.ff17.c6e4.d36d.6b55.e2ce.8c71.8a5b.b6f3.
227 9d4b.eab5.8b3c.e7f2.a8fe.9574.5de0.bf20.3f15.9784.9939.5f9c.
228 e609.564f.d8a4.b825.9819.94aa.2c08.8e4c.9b22.477a.2840.3ed6.
229 3750.6ef1.44dd.89ef.6576.d00a.fbda.9ed2.3b6c.7b0c.bde9.2ade.
230 5c88.c182.481a.1b0f.2bfd.d591.2726.57ba
231 (cut 3 [(dec a) 1] b)
246 ! decrement-underflow
253Reverse look up in 255 sub box
255Looks up the index of a nonzero byte `a` in the substitution box with 255
256values, producing a unique nonzero byte. The inverse of `zaft`.
260`a` is an atom of one byte in length.
269 ++ zart :: reverse 255-sbox
272 0x68.4f07.ea1c.73c9.75c2.efc8.d559.5125.f621.a7a8.8591.5613.
273 dd52.40eb.65a2.60b7.4bcb.1123.ceb0.1bd6.3c84.2906.b164.19b3.
274 1e95.5fec.ffbc.f187.fbe2.6680.7c77.d30e.e94a.9414.fd9a.017d.
275 3a7e.5a55.8ff5.8bf9.c181.e5b6.6ab2.35da.50aa.9293.3bc0.cdc6.
276 f3bf.1a58.4130.f844.3846.744e.36a0.f205.789e.32d8.5e54.5c22.
277 0f76.fce7.4569.0d99.d26e.e879.dc16.2df4.887f.1ffe.4dba.6f5d.
278 bbcc.2663.1762.aed7.af8a.ca20.dbb4.9bc7.a942.834c.105b.c4d4.
279 8202.3e61.a671.90e6.273d.bdab.3157.cfa4.0c2e.df86.2496.f7ed.
280 2b48.2a9d.5318.a343.d128.be9c.a5ad.6bb5.6dfa.c5e1.3408.128d.
281 2c04.0339.97a1.2ff0.49d0.eeb8.6c0a.0b37.b967.c347.d9ac.e072.
282 e409.7b9f.1598.1d3f.33de.8ce3.8970.8e7a
283 (cut 3 [(dec a) 1] b)
303Lookup byte in 256 sub box
305Looks up a byte `a` in a substitution box with 256 values, producing a byte. The
310`a` is an atom of one byte in length.
319 ++ zyft :: forward 256-sbox
322 0xbb49.b71f.b881.b402.17e4.6b86.69b5.1647.115f.dddb.7ca5.
323 8371.4bd5.19a9.b092.605d.0d9b.e030.a0cc.78ba.5706.4d2d.
324 986a.768c.f8e8.c4c7.2f1c.effe.3cae.01c0.253e.65d3.3872.
325 ce0e.7a74.8ac6.daac.7e5c.6479.44ec.4143.3d20.4af0.ee6c.
326 c828.deca.0377.249f.ffcd.7b4f.eb7d.66f2.8951.042e.595a.
327 8e13.f9c3.a79a.f788.6199.9391.7fab.6200.4ce5.0758.e2f1.
328 7594.c945.d218.4248.afa1.e61a.54fb.1482.bea4.96a2.3473.
329 63c2.e7cb.155b.120a.4ed7.bfd8.b31b.4008.f329.fca3.5380.
330 9556.0cb2.8722.2bea.e96e.3ac5.d1bc.10e3.2c52.a62a.b1d6.
331 35aa.d05e.f6a8.0f3b.31ed.559d.09ad.f585.6d21.fd1d.8d67.
332 370b.26f4.70c1.b923.4684.6fbd.cf8b.5036.0539.9cdc.d93f.
333 9068.1edf.8f33.b632.d427.97fa.9ee1
356Reverse lookup byte in 256 sub box
358Looks up a byte `a` in a substitution box with 256 values, producing a byte.
359The inverse of `zyft`.
363`a` is an atom of one byte in length.
372 ++ zyrt :: reverse 256-sbox
375 0x9fc8.2753.6e02.8fcf.8b35.2b20.5598.7caa.c9a9.30b0.9b48.
376 47ce.6371.80f6.407d.00dd.0aa5.ed10.ecb7.0f5a.5c3a.e605.
377 c077.4337.17bd.9eda.62a4.79a7.ccb8.44cd.8e64.1ec4.5b6b.
378 1842.ffd8.1dfb.fd07.f2f9.594c.3be3.73c6.2cb6.8438.e434.
379 8d3d.ea6a.5268.72db.a001.2e11.de8c.88d3.0369.4f7a.87e2.
380 860d.0991.25d0.16b9.978a.4bf4.2a1a.e96c.fa50.85b5.9aeb.
381 9dbb.b2d9.a2d1.7bba.66be.e81f.1946.29a8.f5d2.f30c.2499.
382 c1b3.6583.89e1.ee36.e0b4.6092.937e.d74e.2f6f.513e.9615.
383 9c5d.d581.e7ab.fe74.f01b.78b1.ae75.af57.0ec2.adc7.3245.
384 12bf.2314.3967.0806.31dc.cb94.d43f.493c.54a6.0421.c3a1.
385 1c4a.28ac.fc0b.26ca.5870.e576.f7f1.616d.905f.ef41.33bc.
386 df4d.225e.2d56.7fd6.1395.a3f8.c582
408Reversible scrambling, v2
415A core for performing reversible scrambling operations for the `@p` phonetic
423Randomly permutes atoms that fit into 17 to 32 bits into one another. If the
424atom fits into 33 to 64 bits, does the same permutation on the low 32 bits
425only. Otherwise, passes the atom through unchanged.
440 ?: &((gte pyn 0x1.0000) (lte pyn 0xffff.ffff))
441 (add 0x1.0000 (fice (sub pyn 0x1.0000)))
442 ?: &((gte pyn 0x1.0000.0000) (lte pyn 0xffff.ffff.ffff.ffff))
443 =+ lo=(dis pyn 0xffff.ffff)
444 =+ hi=(dis pyn 0xffff.ffff.0000.0000)
446 (add 0x1.0000 (fice (sub lo 0x1.0000)))
454 > `@p`(feen:ob 111.103)
457 > `@p`(feen:ob ~mophul-pagwyx)
460 > `@p`(feen:ob (fend:ob ~mophul-pagwyx))
472Randomly permutes atoms that fit into 17 to 32 bits into one another, and
473randomly permutes the low 32 bits of atoms that fit into 33 to 64 bits;
474otherwise, passes the atom through unchanged. The inverse of the one applied
490 ?: &((gte cry 0x1.0000) (lte cry 0xffff.ffff))
491 (add 0x1.0000 (teil (sub cry 0x1.0000)))
492 ?: &((gte cry 0x1.0000.0000) (lte cry 0xffff.ffff.ffff.ffff))
493 =+ lo=(dis cry 0xffff.ffff)
494 =+ hi=(dis cry 0xffff.ffff.0000.0000)
496 (add 0x1.0000 (teil (sub lo 0x1.0000)))
504 > `@p`(fend:ob 111.103)
507 > `@p`(fend:ob ~doznec-sapfes)
510 > `@p`(fend:ob ~wisfed-lonwes)
513 > `@p`(fend:ob (feen:ob ~wisfed-lonwes))
516 > `@p`(fend:ob ~tarmed)
525Produces an atom by applying a variant of the Feistel cipher. Unlike
526a conventional Feistel cipher that is its own inverse if keys are used in
527reverse order, this Feistel-like cipher uses two moduli that must be swapped
528when applying the reverse transformation. The inverse of `teil`.
541 ++ fice :: adapted from
542 |= nor=@ :: black and rogaway
543 ^- @ :: "ciphers with
544 =+ ^= sel :: arbitrary finite
545 %+ rynd 2 :: domains", 2002
548 [(mod nor 65.535) (div nor 65.535)]
549 (add (mul 65.535 -.sel) +.sel)
559 > (fice:ob (teil:ob 11))
566Reverse Feistel-like cipher
568Applies the reverse of the Feistel-like cipher applied by `fice`. Unlike
569a conventional Feistel cipher that is its own inverse if keys are used in
570reverse order, this Feistel-like cipher uses two moduli that must be swapped
571when applying the reverse transformation.
584 ++ teil :: reverse ++fice
591 [(mod vip 65.535) (div vip 65.535)]
592 (add (mul 65.535 -.sel) +.sel)
603 > (teil:ob (fice:ob 11))
610Reverse Feistel-like cipher
612A single round of the Feistel-like cipher `fice`. AES ([`aesc`](@/docs/hoon/reference/stdlib/3f.md)) is
613used as the round function. The inverse of `rund`.
635 (~(sum fo 65.535) l (en:aesc (snag n raku) r))
636 (~(sum fo 65.536) l (en:aesc (snag n raku) r))
645 > (rynd:ob 2 (rund:ob 2 37.422 9))
652Reverse single Feistel-like
654A single round of the Feistel-like reverse cipher `teil`. AES ([`aesc`](@/docs/hoon/reference/stdlib/3f.md))
655is used as the round function. The inverse of `rynd`.
677 (~(dif fo 65.535) l (muk (snag n raku) 2 r))
678 (~(dif fo 65.536) l (muk (snag n raku) 2 r))
687 > (rund:ob 2 (rynd:ob 2 28.635 9))
696Produces a list of arbitrary hexademical keys for use with [`aesc`](@/docs/hoon/reference/stdlib/3f.md).
700A list of atoms of aura `@ux` (hexadecimal).
719 ~[0xb76d.5eed 0xee28.1300 0x85bc.ae01 0x4b38.7af7]
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list