[{"data":1,"prerenderedAt":946},["ShallowReactive",2],{"navigation_docs":3,"-guide-transform":116,"-guide-transform-surround":941},[4,36],{"title":5,"path":6,"stem":7,"children":8,"icon":35},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Encode and decode","\u002Fguide\u002Ftransform","1.guide\u002F02.transform",{"title":16,"path":17,"stem":18},"Analysis","\u002Fguide\u002Fanalysis","1.guide\u002F03.analysis",{"title":20,"path":21,"stem":22},"CLI","\u002Fguide\u002Fcli","1.guide\u002F04.cli",{"title":24,"path":25,"stem":26},"Agents","\u002Fguide\u002Fagents","1.guide\u002F05.agents",{"title":28,"path":29,"stem":30},"Custom ciphers","\u002Fguide\u002Fcustom","1.guide\u002F06.custom",{"title":32,"path":33,"stem":34},"Playground","\u002Fguide\u002Fplayground","1.guide\u002F07.playground","i-solar-book-2-linear",{"title":37,"path":38,"stem":39,"children":40,"icon":115},"Ciphers","\u002Fciphers","2.ciphers\u002F00.index",[41,43,47,51,55,59,63,67,71,75,79,83,87,91,95,99,103,107,111],{"title":42,"path":38,"stem":39},"Overview",{"title":44,"path":45,"stem":46},"Caesar","\u002Fciphers\u002Fcaesar","2.ciphers\u002F01.caesar",{"title":48,"path":49,"stem":50},"ROT-13","\u002Fciphers\u002Frot13","2.ciphers\u002F02.rot13",{"title":52,"path":53,"stem":54},"ROT-47","\u002Fciphers\u002Frot47","2.ciphers\u002F03.rot47",{"title":56,"path":57,"stem":58},"Atbash","\u002Fciphers\u002Fatbash","2.ciphers\u002F04.atbash",{"title":60,"path":61,"stem":62},"Affine","\u002Fciphers\u002Faffine","2.ciphers\u002F05.affine",{"title":64,"path":65,"stem":66},"Vigenère","\u002Fciphers\u002Fvigenere","2.ciphers\u002F06.vigenere",{"title":68,"path":69,"stem":70},"Trithemius","\u002Fciphers\u002Ftrithemius","2.ciphers\u002F07.trithemius",{"title":72,"path":73,"stem":74},"Alberti","\u002Fciphers\u002Falberti","2.ciphers\u002F08.alberti",{"title":76,"path":77,"stem":78},"Playfair","\u002Fciphers\u002Fplayfair","2.ciphers\u002F09.playfair",{"title":80,"path":81,"stem":82},"Polybius square","\u002Fciphers\u002Fpolybius","2.ciphers\u002F10.polybius",{"title":84,"path":85,"stem":86},"Morse code","\u002Fciphers\u002Fmorse","2.ciphers\u002F11.morse",{"title":88,"path":89,"stem":90},"Bacon's cipher","\u002Fciphers\u002Fbacon","2.ciphers\u002F12.bacon",{"title":92,"path":93,"stem":94},"Tap code","\u002Fciphers\u002Ftap-code","2.ciphers\u002F13.tap-code",{"title":96,"path":97,"stem":98},"ADFGVX","\u002Fciphers\u002Fadfgvx","2.ciphers\u002F14.adfgvx",{"title":100,"path":101,"stem":102},"Bifid","\u002Fciphers\u002Fbifid","2.ciphers\u002F15.bifid",{"title":104,"path":105,"stem":106},"Rail fence","\u002Fciphers\u002Frail-fence","2.ciphers\u002F16.rail-fence",{"title":108,"path":109,"stem":110},"Columnar transposition","\u002Fciphers\u002Fcolumnar","2.ciphers\u002F17.columnar",{"title":112,"path":113,"stem":114},"Enigma M3","\u002Fciphers\u002Fenigma","2.ciphers\u002F18.enigma","i-solar-library-linear",{"id":117,"title":12,"body":118,"description":934,"extension":935,"links":936,"meta":937,"navigation":185,"path":13,"seo":939,"stem":14,"__hash__":940},"docs\u002F1.guide\u002F02.transform.md",{"type":119,"value":120,"toc":926},"minimark",[121,126,356,374,378,434,440,506,512,516,519,555,562,566,581,681,685,700,750,757,761,919,922],[122,123,125],"h2",{"id":124},"two-methods","Two methods",[127,128,133],"pre",{"className":129,"code":130,"language":131,"meta":132,"style":132},"language-ts shiki shiki-themes github-light github-light poimandres","import { create, resolveCipher } from \"@agntn\u002Fciphers\";\n\nconst caesar = create(\"caesar\");\ncaesar.encode(\"Hello, World!\", { shift: 7 }).text; \u002F\u002F \"Olssv, Dvysk!\"\ncaesar.decode(\"Olssv, Dvysk!\", { shift: 7 }).text; \u002F\u002F \"Hello, World!\"\n\nresolveCipher(\"Rail Fence\").encode(\"WEAREDISCOVEREDRUNATONCE\", { rails: 3 }).text;\n\u002F\u002F \"WECRUOERDSOEERNTNEAIVDAC\"\n","ts","",[134,135,136,180,187,217,264,300,305,350],"code",{"__ignoreMap":132},[137,138,141,145,149,153,156,159,162,166,170,174,177],"span",{"class":139,"line":140},"line",1,[137,142,144],{"class":143},"sP0CR","import",[137,146,148],{"class":147},"sKlNE"," {",[137,150,152],{"class":151},"snHMy"," create",[137,154,155],{"class":147},",",[137,157,158],{"class":151}," resolveCipher",[137,160,161],{"class":147}," }",[137,163,165],{"class":164},"stCPd"," from",[137,167,169],{"class":168},"scVjq"," \"",[137,171,173],{"class":172},"sQ7BG","@agntn\u002Fciphers",[137,175,176],{"class":168},"\"",[137,178,179],{"class":147},";\n",[137,181,183],{"class":139,"line":182},2,[137,184,186],{"emptyLinePlaceholder":185},true,"\n",[137,188,190,194,198,201,204,207,209,212,214],{"class":139,"line":189},3,[137,191,193],{"class":192},"s1TYA","const",[137,195,197],{"class":196},"saoiD"," caesar",[137,199,200],{"class":192}," =",[137,202,152],{"class":203},"sULi6",[137,205,206],{"class":147},"(",[137,208,176],{"class":168},[137,210,211],{"class":172},"caesar",[137,213,176],{"class":168},[137,215,216],{"class":147},");\n",[137,218,220,223,226,229,231,233,236,238,241,244,247,251,254,257,260],{"class":139,"line":219},4,[137,221,211],{"class":222},"spVlQ",[137,224,225],{"class":147},".",[137,227,228],{"class":203},"encode",[137,230,206],{"class":147},[137,232,176],{"class":168},[137,234,235],{"class":172},"Hello, World!",[137,237,176],{"class":168},[137,239,240],{"class":147},", {",[137,242,243],{"class":151}," shift",[137,245,246],{"class":147},":",[137,248,250],{"class":249},"siHFe"," 7",[137,252,253],{"class":147}," }).",[137,255,256],{"class":222},"text",[137,258,259],{"class":147},"; ",[137,261,263],{"class":262},"sjhu3","\u002F\u002F \"Olssv, Dvysk!\"\n",[137,265,267,269,271,274,276,278,281,283,285,287,289,291,293,295,297],{"class":139,"line":266},5,[137,268,211],{"class":222},[137,270,225],{"class":147},[137,272,273],{"class":203},"decode",[137,275,206],{"class":147},[137,277,176],{"class":168},[137,279,280],{"class":172},"Olssv, Dvysk!",[137,282,176],{"class":168},[137,284,240],{"class":147},[137,286,243],{"class":151},[137,288,246],{"class":147},[137,290,250],{"class":249},[137,292,253],{"class":147},[137,294,256],{"class":222},[137,296,259],{"class":147},[137,298,299],{"class":262},"\u002F\u002F \"Hello, World!\"\n",[137,301,303],{"class":139,"line":302},6,[137,304,186],{"emptyLinePlaceholder":185},[137,306,308,311,313,315,318,320,323,325,327,329,332,334,336,339,341,344,346,348],{"class":139,"line":307},7,[137,309,310],{"class":203},"resolveCipher",[137,312,206],{"class":147},[137,314,176],{"class":168},[137,316,317],{"class":172},"Rail Fence",[137,319,176],{"class":168},[137,321,322],{"class":147},").",[137,324,228],{"class":203},[137,326,206],{"class":147},[137,328,176],{"class":168},[137,330,331],{"class":172},"WEAREDISCOVEREDRUNATONCE",[137,333,176],{"class":168},[137,335,240],{"class":147},[137,337,338],{"class":151}," rails",[137,340,246],{"class":147},[137,342,343],{"class":249}," 3",[137,345,253],{"class":147},[137,347,256],{"class":222},[137,349,179],{"class":147},[137,351,353],{"class":139,"line":352},8,[137,354,355],{"class":262},"\u002F\u002F \"WECRUOERDSOEERNTNEAIVDAC\"\n",[357,358,359,362,363,365,366,369,370,373],"p",{},[134,360,361],{},"create"," wants the exact registry name. ",[134,364,310],{}," lowercases and turns runs of whitespace into a hyphen, so ",[134,367,368],{},"\"Rail Fence\""," and ",[134,371,372],{},"\"rail-fence\""," are the same thing - and then it also wants an exact match. Both cache one instance per name.",[122,375,377],{"id":376},"options-every-cipher-shares","Options every cipher shares",[379,380,381,397],"table",{},[382,383,384],"thead",{},[385,386,387,391,394],"tr",{},[388,389,390],"th",{},"Option",[388,392,393],{},"Default",[388,395,396],{},"Effect",[398,399,400,420],"tbody",{},[385,401,402,408,413],{},[403,404,405],"td",{},[134,406,407],{},"preserveCase",[403,409,410],{},[134,411,412],{},"true",[403,414,415,416,419],{},"Lowercase in, lowercase out. ",[134,417,418],{},"false"," uppercases the output.",[385,421,422,427,431],{},[403,423,424],{},[134,425,426],{},"stripNonAlpha",[403,428,429],{},[134,430,418],{},[403,432,433],{},"Drop everything that is not an ASCII letter before the cipher runs.",[357,435,436,437,246],{},"With the defaults a Caesar leaves spaces, digits and punctuation exactly where they were and shifts the letters around them. A puzzle that wants one solid block gets ",[134,438,439],{},"stripNonAlpha: true",[127,441,443],{"className":129,"code":442,"language":131,"meta":132,"style":132},"create(\"vigenere\").encode(\"ATTACK AT DAWN\", { key: \"LEMON\", stripNonAlpha: true }).text;\n\u002F\u002F \"LXFOPVEFRNHR\"\n",[134,444,445,501],{"__ignoreMap":132},[137,446,447,449,451,453,456,458,460,462,464,466,469,471,473,476,478,480,483,485,487,490,492,495,497,499],{"class":139,"line":140},[137,448,361],{"class":203},[137,450,206],{"class":147},[137,452,176],{"class":168},[137,454,455],{"class":172},"vigenere",[137,457,176],{"class":168},[137,459,322],{"class":147},[137,461,228],{"class":203},[137,463,206],{"class":147},[137,465,176],{"class":168},[137,467,468],{"class":172},"ATTACK AT DAWN",[137,470,176],{"class":168},[137,472,240],{"class":147},[137,474,475],{"class":151}," key",[137,477,246],{"class":147},[137,479,169],{"class":168},[137,481,482],{"class":172},"LEMON",[137,484,176],{"class":168},[137,486,155],{"class":147},[137,488,489],{"class":151}," stripNonAlpha",[137,491,246],{"class":147},[137,493,494],{"class":249}," true",[137,496,253],{"class":147},[137,498,256],{"class":222},[137,500,179],{"class":147},[137,502,503],{"class":139,"line":182},[137,504,505],{"class":262},"\u002F\u002F \"LXFOPVEFRNHR\"\n",[357,507,508,511],{},[134,509,510],{},"options"," on the result echoes what was applied, both flags included when you set them. One log line and you can rerun the call.",[122,513,515],{"id":514},"ciphers-that-reshape-the-input","Ciphers that reshape the input",[357,517,518],{},"Some ciphers can't leave the input alone, so the round trip comes back reshaped:",[520,521,522,529,534,542],"ul",{},[523,524,525,528],"li",{},[526,527,76],"a",{"href":77}," works on letter pairs. It strips non-letters, folds J into I, splits doubled letters with X and pads an odd length with X.",[523,530,531,533],{},[526,532,96],{"href":97}," keeps letters and digits and drops the rest.",[523,535,536,369,538,541],{},[526,537,100],{"href":101},[526,539,540],{"href":81},"Polybius"," fold J into I, and Bifid drops non-letters.",[523,543,544,547,548,369,551,554],{},[526,545,546],{"href":85},"Morse",", ",[526,549,550],{"href":89},"Bacon",[526,552,553],{"href":93},"tap code"," change the alphabet entirely. You get uppercase back and, for Morse, single spaces.",[357,556,557,558,561],{},"For everything else ",[134,559,560],{},"decode(encode(x)) === x"," holds for any input. Emoji, Polish letters, whatever - they pass through untouched.",[122,563,565],{"id":564},"self-inverse-ciphers","Self-inverse ciphers",[357,567,568,569,369,571,573,574,577,578,580],{},"ROT-13, ROT-47, Atbash and Enigma are their own inverse. ",[134,570,228],{},[134,572,273],{}," do the same thing and ",[134,575,576],{},"info().selfInverse"," says so. Both methods still exist on every cipher, so you can write ",[134,579,273],{}," and mean it.",[127,582,584],{"className":129,"code":583,"language":131,"meta":132,"style":132},"const rot13 = create(\"rot13\");\nrot13.decode(rot13.encode(\"HELLO\").text).text === \"HELLO\"; \u002F\u002F true\nrot13.encode(\"URYYB\").text; \u002F\u002F \"HELLO\", same thing\n",[134,585,586,608,655],{"__ignoreMap":132},[137,587,588,590,593,595,597,599,601,604,606],{"class":139,"line":140},[137,589,193],{"class":192},[137,591,592],{"class":196}," rot13",[137,594,200],{"class":192},[137,596,152],{"class":203},[137,598,206],{"class":147},[137,600,176],{"class":168},[137,602,603],{"class":172},"rot13",[137,605,176],{"class":168},[137,607,216],{"class":147},[137,609,610,612,614,616,618,620,622,624,626,628,631,633,635,637,639,641,644,646,648,650,652],{"class":139,"line":182},[137,611,603],{"class":222},[137,613,225],{"class":147},[137,615,273],{"class":203},[137,617,206],{"class":147},[137,619,603],{"class":222},[137,621,225],{"class":147},[137,623,228],{"class":203},[137,625,206],{"class":147},[137,627,176],{"class":168},[137,629,630],{"class":172},"HELLO",[137,632,176],{"class":168},[137,634,322],{"class":147},[137,636,256],{"class":222},[137,638,322],{"class":147},[137,640,256],{"class":222},[137,642,643],{"class":192}," ===",[137,645,169],{"class":168},[137,647,630],{"class":172},[137,649,176],{"class":168},[137,651,259],{"class":147},[137,653,654],{"class":262},"\u002F\u002F true\n",[137,656,657,659,661,663,665,667,670,672,674,676,678],{"class":139,"line":189},[137,658,603],{"class":222},[137,660,225],{"class":147},[137,662,228],{"class":203},[137,664,206],{"class":147},[137,666,176],{"class":168},[137,668,669],{"class":172},"URYYB",[137,671,176],{"class":168},[137,673,322],{"class":147},[137,675,256],{"class":222},[137,677,259],{"class":147},[137,679,680],{"class":262},"\u002F\u002F \"HELLO\", same thing\n",[122,682,684],{"id":683},"options-per-cipher","Options per cipher",[357,686,687,688,691,692,695,696,699],{},"Each cipher validates its own options and lists them in ",[134,689,690],{},"info().options"," with a type, whether it is required, a default and a description. The ",[526,693,32],{"href":694},"\u002Fplayground"," form and ",[134,697,698],{},"ciphers info"," are built from that list, nothing is typed twice:",[127,701,703],{"className":129,"code":702,"language":131,"meta":132,"style":132},"create(\"affine\").info().options;\n\u002F\u002F [\n\u002F\u002F   { name: \"a\", type: \"number\", required: false, default: 5, description: \"Multiplier (must be coprime with 26: ...)\" },\n\u002F\u002F   { name: \"b\", type: \"number\", required: false, default: 8, description: \"Additive shift (0-25)\" },\n\u002F\u002F ]\n",[134,704,705,730,735,740,745],{"__ignoreMap":132},[137,706,707,709,711,713,716,718,720,723,726,728],{"class":139,"line":140},[137,708,361],{"class":203},[137,710,206],{"class":147},[137,712,176],{"class":168},[137,714,715],{"class":172},"affine",[137,717,176],{"class":168},[137,719,322],{"class":147},[137,721,722],{"class":203},"info",[137,724,725],{"class":147},"().",[137,727,510],{"class":222},[137,729,179],{"class":147},[137,731,732],{"class":139,"line":182},[137,733,734],{"class":262},"\u002F\u002F [\n",[137,736,737],{"class":139,"line":189},[137,738,739],{"class":262},"\u002F\u002F   { name: \"a\", type: \"number\", required: false, default: 5, description: \"Multiplier (must be coprime with 26: ...)\" },\n",[137,741,742],{"class":139,"line":219},[137,743,744],{"class":262},"\u002F\u002F   { name: \"b\", type: \"number\", required: false, default: 8, description: \"Additive shift (0-25)\" },\n",[137,746,747],{"class":139,"line":266},[137,748,749],{"class":262},"\u002F\u002F ]\n",[357,751,752,753,756],{},"In your own cipher read one with ",[134,754,755],{},"getOpt(options, \"shift\", 3)",". Fallback when the key is absent, the value as typed otherwise.",[122,758,760],{"id":759},"what-a-wrong-option-does","What a wrong option does",[127,762,764],{"className":129,"code":763,"language":131,"meta":132,"style":132},"create(\"caesar\").encode(\"X\", { shift: 0 }); \u002F\u002F InvalidOptionError, 0 is the identity\ncreate(\"affine\").encode(\"X\", { a: 13 }); \u002F\u002F InvalidOptionError, gcd(13, 26) is 13\ncreate(\"vigenere\").encode(\"X\"); \u002F\u002F MissingOptionError: key\ncreate(\"enigma\").encode(\"X\", { plugboard: \"AB AC\" }); \u002F\u002F InvalidOptionError, a letter in two pairs\n",[134,765,766,806,845,875],{"__ignoreMap":132},[137,767,768,770,772,774,776,778,780,782,784,786,789,791,793,795,797,800,803],{"class":139,"line":140},[137,769,361],{"class":203},[137,771,206],{"class":147},[137,773,176],{"class":168},[137,775,211],{"class":172},[137,777,176],{"class":168},[137,779,322],{"class":147},[137,781,228],{"class":203},[137,783,206],{"class":147},[137,785,176],{"class":168},[137,787,788],{"class":172},"X",[137,790,176],{"class":168},[137,792,240],{"class":147},[137,794,243],{"class":151},[137,796,246],{"class":147},[137,798,799],{"class":249}," 0",[137,801,802],{"class":147}," }); ",[137,804,805],{"class":262},"\u002F\u002F InvalidOptionError, 0 is the identity\n",[137,807,808,810,812,814,816,818,820,822,824,826,828,830,832,835,837,840,842],{"class":139,"line":182},[137,809,361],{"class":203},[137,811,206],{"class":147},[137,813,176],{"class":168},[137,815,715],{"class":172},[137,817,176],{"class":168},[137,819,322],{"class":147},[137,821,228],{"class":203},[137,823,206],{"class":147},[137,825,176],{"class":168},[137,827,788],{"class":172},[137,829,176],{"class":168},[137,831,240],{"class":147},[137,833,834],{"class":151}," a",[137,836,246],{"class":147},[137,838,839],{"class":249}," 13",[137,841,802],{"class":147},[137,843,844],{"class":262},"\u002F\u002F InvalidOptionError, gcd(13, 26) is 13\n",[137,846,847,849,851,853,855,857,859,861,863,865,867,869,872],{"class":139,"line":189},[137,848,361],{"class":203},[137,850,206],{"class":147},[137,852,176],{"class":168},[137,854,455],{"class":172},[137,856,176],{"class":168},[137,858,322],{"class":147},[137,860,228],{"class":203},[137,862,206],{"class":147},[137,864,176],{"class":168},[137,866,788],{"class":172},[137,868,176],{"class":168},[137,870,871],{"class":147},"); ",[137,873,874],{"class":262},"\u002F\u002F MissingOptionError: key\n",[137,876,877,879,881,883,886,888,890,892,894,896,898,900,902,905,907,909,912,914,916],{"class":139,"line":219},[137,878,361],{"class":203},[137,880,206],{"class":147},[137,882,176],{"class":168},[137,884,885],{"class":172},"enigma",[137,887,176],{"class":168},[137,889,322],{"class":147},[137,891,228],{"class":203},[137,893,206],{"class":147},[137,895,176],{"class":168},[137,897,788],{"class":172},[137,899,176],{"class":168},[137,901,240],{"class":147},[137,903,904],{"class":151}," plugboard",[137,906,246],{"class":147},[137,908,169],{"class":168},[137,910,911],{"class":172},"AB AC",[137,913,176],{"class":168},[137,915,802],{"class":147},[137,917,918],{"class":262},"\u002F\u002F InvalidOptionError, a letter in two pairs\n",[357,920,921],{},"All of them thrown before the first character is touched. A cipher that quietly accepts shift 0 and hands your text back unchanged is worse than one that throws.",[923,924,925],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .spVlQ, html code.shiki .spVlQ{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E4F0FB}html pre.shiki code .siHFe, html code.shiki .siHFe{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#5DE4C7}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":132,"searchDepth":182,"depth":182,"links":927},[928,929,930,931,932,933],{"id":124,"depth":182,"text":125},{"id":376,"depth":182,"text":377},{"id":514,"depth":182,"text":515},{"id":564,"depth":182,"text":565},{"id":683,"depth":182,"text":684},{"id":759,"depth":182,"text":760},"The two methods every cipher has, the two options they share, and what happens to case and punctuation on the way through.","md",null,{"icon":938},"i-solar-transfer-horizontal-linear",{"title":12,"description":934},"3XH9S3q2BdErFYzUijqzQCLCSvXX3kL-0dINpudy6-8",[942,944],{"title":10,"path":6,"stem":7,"description":943,"children":-1},"Install, encode one line, decode it back. Same shape from every cipher.",{"title":16,"path":17,"stem":18,"description":945,"children":-1},"Brute force a Caesar with all 25 shifts. Read a histogram and the index of coincidence before guessing a key.",1788614951661]