Wedding Ring Cipher contest winners


Last month, Bruce Schneier and I announced a public cryptographic challenge: help figure out how to create ciphers and other privacy applications for my code-wheel wedding rings, designed by Bruce and created by Isabel Rucker.

Out of the submissions, there were a couple dozen that were really strong contenders, and Bruce picked two to receive the winner and runner-up prize.

Congrats to Chris Smith for taking first place with The Fidget Protocol and to Philippe Teuwen for taking runner-up with his wedding-ring polyalphabetic substitution cipher.

My wife and I will take great pleasure in using both ciphers to communicate in private!

Thanks, guys -- your prizes are in the mail (and thanks to everyone who contributed suggestions to this!).

15

  1. Cory – seems to be something amiss with the Fidget .zip file. Extra bytes on the front, or something?

  2. Jesus, those are both super complicated. Or maybe I’m no cryptographer. Well, there’s no maybe to it.

  3. I just had someone at the next desk verify – same results.

    It comes up as corrupted, whether we do “click and go” or “save and open”.

  4. the real question is when kits with blanks and letter punches will be available. Your decoder rings can be the first of a trend, but I dont want them to be so unique that I cant have one.

  5. @7
    Easy, just marry Cory.

    I’m surprised that each of the three rings seems to be in alphabetical order. Wasn’t that element of predictability one of the big reasons that the Enigma codes were eventually cracked? Disclaimer: I know exactly squat about cryptography.

  6. Ok – very strange.

    Everywhere in one organization, the download is toast.

    Everywhere in another organization, it works just fine.

    I suspect a proxy somewhere is gumming up the works.

  7. Drat. I thought my plan for secret decoder rings for my partner and myself was totally unique (and having a brother who is a jeweller helps the plan)! However, I suspect this cypher is way more complicated than ours is set out to be.

  8. @RobotGod;

    I think you’ll find that if you practice a while, it’s not as tough as you think. Part of my reasoning for that is that although I think Fidget – which I created – is quite straight-forward, I stil think the polyalphabetic one is incredibly complex.

    This suggests that any protocol you’re not familiar with is complex, but one you’ve practiced with will seem much easier.

  9. “fidget” isn’t a user-friendly proof-of-concept example!

    It blew up on my PowerPC Mac and FreeBSD boxes. Apply the following changes to avoid the bus errors/segmentation faults and get it to compile with “gcc -W”:

    The added “return” statements are to make “gcc” stop complaining.

    The change from “char *msg” to “static char msg[]” is to move the texts involved from read-only memory to read-write memory.

    This code doesn’t behave well with mixed case strings to encode.

    $ diff -c -b -w ~/Downloads/FidgetProtocol/FIDGET.C ~/src/fidget.c
    *** /Users/rsc/Downloads/FidgetProtocol/FIDGET.C 2008-09-30 17:50:44.000000000 -0400
    — /Users/rsc/src/fidget.c 2008-10-15 16:03:14.000000000 -0400
    ***************
    *** 236,242 ****

    char EncodeKeyAndChar(char nextkey, char nextchar) {

    ! char *msg = “[ENC:–>”;

    msg[5] = nextkey;
    msg[6] = nextchar;
    — 236,242 —-

    char EncodeKeyAndChar(char nextkey, char nextchar) {

    ! static char msg[] = { ‘[‘, ‘E’, ‘N’, ‘C’, ‘:’, ‘-‘, ‘-‘, ‘>’, ‘\0’};

    msg[5] = nextkey;
    msg[6] = nextchar;
    ***************
    *** 323,329 ****

    char DecodeKeyAndChar(char nextkey, char nextchar) {
    ! char *msg = “[DEC:–>”;

    msg[5] = nextkey;
    msg[6] = nextchar;
    — 323,329 —-

    char DecodeKeyAndChar(char nextkey, char nextchar) {
    ! static char msg[] = { ‘[‘, ‘D’, ‘E’, ‘C’, ‘:’, ‘-‘, ‘-‘, ‘>’, ‘\0’};

    msg[5] = nextkey;
    msg[6] = nextchar;
    ***************
    *** 428,434 ****
    printf(“\n”);
    printf(“Prefix encode or decode string with ‘?’ to\n”);
    printf(“all details of ring movements.\n”);
    ! return;
    }

    if (argc > 2) keystore = argv[1];
    — 428,434 —-
    printf(“\n”);
    printf(“Prefix encode or decode string with ‘?’ to\n”);
    printf(“all details of ring movements.\n”);
    ! return (1);
    }

    if (argc > 2) keystore = argv[1];
    ***************
    *** 472,476 ****
    printf(“%c%c%c\n”,Ring(1),Ring(2),Ring(3));
    }
    printf(“Final: %s\n”, result);
    }

    \ No newline at end of file
    — 472,477 —-
    printf(“%c%c%c\n”,Ring(1),Ring(2),Ring(3));
    }
    printf(“Final: %s\n”, result);
    +
    + return (0);
    }

  10. @userw014

    “fidget” isn’t a user-friendly proof-of-concept example!

    I can see that. Quoting myself from the accompanying paper…

    “Included with this paper is the sample C code used to test the Fidget protocol. The code is not of great quality, and is in need of serious rework. It is likely to be most valuable as a working example of the protocol for others to re-implement.”

    This code doesn’t behave well with mixed case strings to encode.

    “All strings must be uppercase letters.” It says so in the code. I didn’t reach the point of needing to decide between arbitrarily converting all strings to uppercase or always throwing an error if you used any non-uppercase characters.

    All told – 4 changes, and none of them to the ring manipulation code. Call me ‘satisfied’ – ‘pleased’ wasn’t going to be on the menu for this code.

  11. My concern with the pretty rings is sliding and alignment, fixed alphabet and dots. To combat that I’m designing a crypto braclet with 36 blank slots and a smooth interlocking design.
    For those interested click through to my BB user page to my flickr page and await the neatoness.
    shapeways.com is awesome for rapid prototyping! i loves them.

Comments are closed.