Analysis of the GitLab Ciphercube

Shortly after I joined GitLab in Sep 2022, GitLab’s security team opened up a Swag initiative for a “laser-engraved cube made from sustainably sourced wood with a message on each side”.
Up for such an offer and challenge, I subscribed and received on the 7th Dec 2022 a small wooden cube.

CipherCube Portrait

In my lunch break today, 8th Dec 2022, I started to decipher the cube.
On first glance 1 side showed the GitLab Tanuki and 5 sides had small shields standing out of the engraving in patterns.

CipherCube Shield Side

I inspected those that the shields were structured on each of the five sides in an 8x8 grid, with the shield giving a clear orientation where the bottom of the grid should be. 8x8 on a side, so one byte per row, 8 byte per side.

CipherCube Fold

Next I translated the patterns into binary for all the sides as well as into decimal side, leaving us with 8 binary/decimal numbers per side.

Dice sideRowBinaryDecimal
Up111111111255
Up20000110113
Up3000001015
Up4000001015
Up5000001117
Up6000001004
Up70001000117
Up811111111255
----
left111111111255
left2000001015
left30001000117
left40000111115
left5000001117
left6000001004
left70001000117
left811111111255
----
down111111111255
down20001001119
down30001010121
down4000001106
down50001100024
down60000110113
down70000111014
down811111111255
----
bottom1000000102
bottom2000001004
bottom3000000011
bottom4000001106
bottom50001000117
bottom60000111115
bottom7000001106
bottom811111111255
----
right10001000016
right20000110113
right3000001106
right40000110113
right511111111255
right60001100024
right70001000117
right80001000016

Note: The side data above was decoded from close-up photos using image analysis (shield centroid detection + 8x8 grid snap). The side names (Up/Left/Down/Bottom/Right) are tentative — I’ll correct them when I re-examine the physical cube.

The cipher

The raw decimal values looked odd at first. No printable ASCII characters. But looking at the first two sides together, the pattern clicked.

Each byte encodes a letter position (A=0, B=1, … Z=25), shifted by 13, ROT13. The decoding formula: take the byte value, add 13, modulo 26, map to a letter.

Byte 13 → (13+13) % 26 = 0 → A
Byte 5 → (5+13) % 26 = 18 → S

Applied to the Up side (inner rows): 13, 5, 5, 7, 4, 17 → A-S-S-U-R-E
Left side: 5, 17, 15, 7, 4, 17 → S-E-C-U-R-E

The border rows (all shields, value 255) also decode: (255+13) % 26 = 8 → I. The full row of shields that frames each side doubles as the word “I” in the message.

CipherCube GITLAB side

Applying the same decode to the remaining sides:

SideBytes (all 8 rows)Decoded
Up[255], 13, 5, 5, 7, 4, 17, [255]I · ASSURE · I
Left[255], 5, 17, 15, 7, 4, 17, [255]I · SECURE · I
Down[255], 19, 21, 6, 24, 13, 14, [255]I · GITLAB · I
Bottom2, 4, 1, 6, 17, 15, 6, [255]PROTECT · I
Right16, 13, 6, 13, [255], 24, 17, 16D-A-T-A · I · L-E-D

[255] marks full-shield rows. They decode to the letter I via (255+13) % 26 = 8, and double as visual framing — or, in the case of the Right side, as a hyphen embedded in the word.

Two sides break the symmetric “I ··· I” frame:

  • Bottom has 7 data rows with the border only at the bottom. Row 1 starts directly with P (byte 2), no leading “I”.
  • Right puts the full-shield “I” in the middle of the face (row 5). Rows 1-4 decode to D-A-T-A, row 5 is the I, rows 6-8 decode to L-E-D. Read literally: DATA-I-LED. The cleanest interpretation is DATA-LED (a single compound word, with the middle I as hyphen) — a fitting adjective for a security team’s approach.

CipherCube PROTECT side

CipherCube DETAILED side

The message

Reading the full 8-byte sequence per side, borders included:

I ASSURE I · I SECURE I · PROTECT I · I GITLAB I · DATA-LED

Four sides read as a first-person pledge: I ASSURE · I SECURE · I PROTECT · I GITLAB. The fifth side drops the framing and makes the “I” part of the word itself, giving DATA-LED — the hyphenated adjective for a team whose work is driven by what the data says. Nice design.

CipherCube 3D overview

Wrap-up

Five engraved sides, five words, one cipher. ROT13 over an 8x8 shield grid, with border rows pulling double duty as the letter “I” and as visual framing. The sixth face sits out of the cipher and carries the Tanuki.

What I like about the design: it’s solvable from first principles. No key to guess, no lookup table needed. Once you notice the border rows decode to the same value as the word “I” in the pledge, the whole thing clicks open. Security swag that actually rewards security thinking.

CipherCube Tanuki side

The sixth face carries the GitLab Tanuki, no cipher. Just the logo, watching over the pledge engraved into the other five sides.