<snapdata remixID="9442320"><project name="text to bignum" app="Snap! 7, https://snap.berkeley.edu" version="2"><notes>A very simple encryption algorithm that treats each letter in the text as a digit in base 2^16 (or 2^32 if you prefer) using the unicode reporter. Encryption is just integer multiplication followed by addition and decryption is just subtraction followed by division.&#xD;&#xD;An early version of this only relied upon multiplcation and division but an attacker could look for common factors in a set of message encrypted with the same keys. Addition prevents that.&#xD;&#xD;Relies upon the BIGNUM library.</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="text to bignum"><notes>A very simple encryption algorithm that treats each letter in the text as a digit in base 2^16 (or 2^32 if you prefer) using the unicode reporter. Encryption is just integer multiplication followed by addition and decryption is just subtraction followed by division.&#xD;&#xD;An early version of this only relied upon multiplcation and division but an attacker could look for common factors in a set of message encrypted with the same keys. Addition prevents that.&#xD;&#xD;Relies upon the BIGNUM library.</notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="let %&apos;var&apos; be %&apos;value&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>var</l><block var="value"/></block></script></block-definition><block-definition s="Number to text %&apos;text number&apos;" type="reporter" category="operators"><comment x="0" y="0" w="198.57142857142858" collapsed="false">This reports a number as text in the &apos;base&apos; where each digit is a Unicode character.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doIf"><block s="reportNot"><custom-block s="Scheme number %s of %s"><l>integer?</l><block var="text number"/></custom-block></block><script><block s="doReport"><l>Non-integer passed to &apos;Number to text&apos;. Maybe the wrong secret key was used.</l></block></script></block><block s="doIf"><block s="reportLessThan"><block var="text number"/><block var="base"/></block><script><block s="doReport"><block s="reportUnicodeAsLetter"><block var="text number"/></block></block></script></block><custom-block s="let %upvar be %s"><l>last digit</l><block s="reportModulus"><block var="text number"/><block var="base"/></block></custom-block><block s="doReport"><block s="reportJoinWords"><list><custom-block s="Number to text %n"><block s="reportQuotient"><block s="reportDifference"><block var="text number"/><block var="last digit"/></block><block var="base"/></block></custom-block><block s="reportUnicodeAsLetter"><block var="last digit"/></block></list></block></block></script></block-definition><block-definition s="Text to number %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="294.2857142857143" collapsed="false">Treats text as a number in base (default is 2^16)</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doIf"><block s="reportEquals"><block s="reportStringSize"><block var="text"/></block><l>0</l></block><script><block s="doReport"><l>0</l></block></script></block><block s="doReport"><block s="reportVariadicSum"><list><block s="reportUnicode"><block s="reportLetter"><l><option>last</option></l><block var="text"/></block></block><block s="reportVariadicProduct"><list><custom-block s="Text to number %txt"><block s="reportJoinWords"><list><custom-block s="all but last of %l"><block s="reportTextSplit"><block var="text"/><l><option>letter</option></l></block></custom-block></list></block></custom-block><block var="base"/></list></block></list></block></block></script></block-definition><block-definition s="Encode %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="493.5714285714286" collapsed="true">Encoding is just adding a number and  the product of the text seen as a number by another number</comment><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><custom-block s="Text to number %txt"><block var="text"/></custom-block><block var="a"/></list></block><block var="b"/></list></block></block></script></block-definition><block-definition s="Decode %&apos;code&apos;" type="reporter" category="operators"><comment x="0" y="0" w="220" collapsed="true">Decoding just subtracts and then divides</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><custom-block s="Number to text %n"><block s="reportQuotient"><block s="reportDifference"><block var="code"/><block var="b"/></block><block var="a"/></block></custom-block></block></script></block-definition><block-definition s="Display encodings of %&apos;text&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>0</l></block><block s="write"><block s="reportJoinWords"><list><l>"</l><block var="text"/><l>" encoded as an integer:</l></list></block><l>12</l></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>-30</l></block><block s="write"><block s="reportJoinWords"><list><custom-block s="Encode %txt"><block var="text"/></custom-block></list></block><l>12</l></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>-60</l></block><block s="write"><block s="reportJoinWords"><list><l>"</l><block var="text"/><l>" encoded as text:</l></list></block><l>12</l></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>-90</l></block><block s="write"><custom-block s="Number to text %n"><custom-block s="Encode %txt"><block var="text"/></custom-block></custom-block><l>12</l></block><block s="gotoXY"><block s="reportAttributeOf"><l><option>left</option></l><l>Stage</l></block><l>-120</l></block><block s="write"><l> Look at the Explanation sprite to see how this works.          </l><l>12</l></block></script></block-definition><block-definition s="I %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><custom-block s="Text to number %txt"><block var="text"/></custom-block></block></script></block-definition><block-definition s="T %&apos;number&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><custom-block s="Number to text %n"><block var="number"/></custom-block></block></script></block-definition><block-definition s="all but last of %&apos;list&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="list"/></block><l>1</l></block><block s="reportNewList"><list></list></block><block s="reportListItem"><block s="reportNumbers"><l>1</l><block s="reportDifference"><block s="reportListAttribute"><l><option>length</option></l><block var="list"/></block><l>1</l></block></block><block var="list"/></block></block></block></script></block-definition><block-definition s="USE BIGNUMS %&apos;bool&apos;" type="command" category="operators"><comment x="0" y="0" w="303.3333333333333" collapsed="false">call with True to turn on the entire Scheme numeric tower, including infinite-precision integers, exact rationals, and complex numbers; call with False to restore native JavaScript arithmetic.</comment><header></header><code></code><translations>pt:altera utilização de aritmética do Scheme para _&#xD;</translations><inputs><input type="%b"></input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/biginteger.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/schemeNumber.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/bignums.js</l></list></block><block s="doApplyExtension"><l>big_switch(bool)</l><list><block var="bool"/></list></block></script></block-definition><block-definition s="%&apos;n&apos; !" type="reporter" category="operators"><comment x="0" y="0" w="190.66666666666663" collapsed="false">The factorial function, to make very large numbers, to demo bignums.</comment><header></header><code></code><translations></translations><inputs><input type="%n"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportEquals"><block var="n"/><l>0</l></block><l>1</l><block s="reportVariadicProduct"><list><block var="n"/><custom-block s="%n !"><block s="reportDifference"><block var="n"/><l>1</l></block></custom-block></list></block></block></block></script></block-definition><block-definition s="%&apos;x&apos;" type="reporter" category="operators"><comment x="0" y="0" w="234.66666666666666" collapsed="false">The identity function: reports its input.&#xD;It&apos;s useful to get things like 3/4 or 5-2i into&#xD;numeric input slots.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block var="x"/></block></script></block-definition><block-definition s="Scheme number %&apos;function&apos; of %&apos;number&apos;" type="reporter" category="operators"><comment x="0" y="0" w="300" collapsed="true">Provides Scheme arithmetic functions not in JavaScript</comment><header></header><code></code><translations>pt:_ de _&#xD;</translations><inputs><input type="%s" readonly="true"><options>number?&#xD;complex?&#xD;real?&#xD;rational?&#xD;integer?&#xD;exact?&#xD;inexact?&#xD;exact&#xD;inexact&#xD;finite?&#xD;infinite?&#xD;nan?&#xD;numerator&#xD;denominator&#xD;real-part&#xD;imag-part&#xD;magnitude&#xD;angle</options></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>big_scheme(fn, num)</l><list><block var="function"/><block var="number"/></list></block></block></script></block-definition></blocks><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="293"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnGGMbVd13/c+90PemzHQDyg4BVEpJcGWUYAmClWEGjd1n12SvHnjFCwjEI2JW5vSZ7dNYrWE9KlAIwNKjZPaVohNUVCoTcPMPDWv9ovVOhJCSZRSqIIMlRupJGmM5A8JeGbeB+7Z1TrZ62jdPXufc+e+57fn3vn5yxvfe87Ze//W2uu/19r7XO/4DwIQgAAEIACBq07AX/UWaRACEIAABCAAAYcA4wQQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQgAAEIACBCgQQ4ArQaRICEIAABCCAAOMDEIAABCAAgQoEEOAK0GkSAhCAAAQggADjAxCAAAQgAIEKBBDgCtBpEgIQgAAEIIAA4wMQ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</pentrails><costumes><list struct="atomic" id="294"></list></costumes><sounds><list struct="atomic" id="295"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="2"><sprite name="Main" idx="1" x="182.25" y="-120" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="300"><costumes><list struct="atomic" id="301"></list></costumes><sounds><list struct="atomic" id="302"></list></sounds><blocks></blocks><variables></variables><scripts><script x="32.142857142857146" y="21.42857142857143"><block s="receiveGo"></block><custom-block s="USE BIGNUMS %b"><l><bool>true</bool></l></custom-block><block s="doDeclareVariables"><list><l>pass phrase</l></list></block><block s="doSetVar"><l>pass phrase</l><l>Something no one will ever guess?</l></block><block s="doSetVar"><l>base</l><block s="reportMonadic"><l><option>2^</option></l><l>16</l><comment w="523.5714285714286" collapsed="true">The base can be 2^32 to include every possible Unicode character but 32-bits is very rarely used. </comment></block></block><block s="doSetVar"><l>a</l><custom-block s="I %txt"><block s="reportJoinWords"><list><block s="reportListItem"><block s="reportNumbers"><l>1</l><block s="reportRound"><block s="reportQuotient"><block s="reportStringSize"><block var="pass phrase"/></block><l>2</l></block></block></block><block s="reportTextSplit"><block var="pass phrase"/><l><option>letter</option></l></block></block></list></block></custom-block></block><block s="doSetVar"><l>b</l><custom-block s="I %txt"><block s="reportJoinWords"><list><block s="reportListItem"><block s="reportNumbers"><block s="reportVariadicSum"><list><block s="reportRound"><block s="reportQuotient"><block s="reportStringSize"><block var="pass phrase"/></block><l>2</l></block></block><l>1</l></list></block><block s="reportStringSize"><block var="pass phrase"/></block></block><block s="reportTextSplit"><block var="pass phrase"/><l><option>letter</option></l></block></block></list></block></custom-block></block><block s="clear"></block><block s="gotoXY"><l>0</l><l>0</l></block><block s="doAsk"><l>Enter any text</l></block><custom-block s="Display encodings of %txt"><block s="getLastAnswer"></block></custom-block></script><script x="27.428571428571413" y="543.5714285714286"><custom-block s="Decode %n"><custom-block s="Encode %txt"><l>這是中文  😀</l></custom-block><comment w="171.42857142857162" collapsed="true">It works with any kind of text.</comment></custom-block></script><script x="28.571428571428573" y="504.57142857142867"><custom-block s="Decode %n"><custom-block s="Encode %txt"><l>What is my message?</l></custom-block><comment w="210.00000000000009" collapsed="true">And here&apos;s a test to show this works.</comment></custom-block></script><script x="27.142857142857146" y="614.0000000000008"><custom-block s="Number to text %n"><custom-block s="Encode %txt"><l>What is my message?</l></custom-block><comment w="349.28571428571433" collapsed="true">The encrypted text can be turned into Unicode for conciseness.</comment></custom-block></script><script x="25.999999999999986" y="581.7142857142858"><custom-block s="Encode %txt"><l>What is my message?</l></custom-block></script><script x="32.142857142857146" y="694.6190476190484"><block s="doSetVar"><l>a</l><l>42</l><comment w="437.85714285714306" collapsed="false">Before saving this project reset the secret keys to any non-bignum integer other than 0.</comment></block><block s="doSetVar"><l>b</l><l>24</l></block></script></scripts></sprite><sprite name="Explanation" idx="2" x="118" y="-39.324324324324266" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="0,195.22799999999998,221.85,1" pen="tip" id="408"><costumes><list struct="atomic" id="409"></list></costumes><sounds><list struct="atomic" id="410"></list></sounds><blocks></blocks><variables></variables><scripts><script x="23.142857142857128" y="24.857142857142826"><custom-block s="USE BIGNUMS %b"><l><bool>true</bool></l></custom-block><block s="doSetVar"><l>base</l><block s="reportMonadic"><l><option>2^</option></l><l>16</l><comment w="523.5714285714286" collapsed="true">The base can be 2^32 to include every possible Unicode character but 32-bits is very rarely used. </comment></block></block><block s="doSetVar"><l>x</l><custom-block s="I %txt"><l>A secret message!</l><comment w="232.14285714285717" collapsed="true">Set x to a reversable function of some text.</comment></custom-block></block></script><script x="22.857142857142858" y="121.57142857142065"><block s="doSetVar"><l>y</l><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block var="a"/><block var="x"/></list></block><block var="b"/></list></block><comment w="113.57142857142858" collapsed="true">Encrypt message.</comment></block></script><script x="22.142857142857146" y="175.9523809523775"><block s="reportEquals"><block var="x"/><block s="reportQuotient"><block s="reportDifference"><block var="y"/><block var="b"/></block><block var="a"/></block><comment w="125.71428571428572" collapsed="true">Decrypt message</comment></block></script><script x="27.857142857142858" y="225.66666666665634"><custom-block s="T %n"><block s="reportQuotient"><block s="reportDifference"><block var="y"/><block var="b"/></block><block var="a"/></block><comment w="160.71428571428572" collapsed="true">See decryption as text</comment></custom-block></script><script x="26.7142857142857" y="280.2857142857143"><block s="reportEquals"><custom-block s="I %txt"><l>Hello</l></custom-block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportUnicode"><l>H</l></block><block s="reportPower"><block s="reportPower"><l>2</l><l>16</l></block><l>4</l></block></list></block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportUnicode"><l>e</l></block><block s="reportPower"><block s="reportPower"><l>2</l><l>16</l></block><l>3</l></block></list></block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportUnicode"><l>l</l></block><block s="reportPower"><block s="reportPower"><l>2</l><l>16</l></block><l>2</l></block></list></block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportUnicode"><l>l</l></block><block s="reportPower"><block s="reportPower"><l>2</l><l>16</l></block><l>1</l></block></list></block><block s="reportVariadicProduct"><list><block s="reportUnicode"><l>o</l></block><block s="reportPower"><block s="reportPower"><l>2</l><l>16</l></block><l>0</l></block></list></block></list></block></list></block></list></block></list></block><comment w="114.28571428571438" collapsed="false">An example of how text is turned into a number.</comment></block></script></scripts></sprite><watcher var="base" style="normal" x="15.416666666666742" y="58.275003083333345" color="243,118,29" hidden="true"/><watcher var="a" style="normal" x="15.416666666666742" y="101.13333950000003" color="243,118,29" hidden="true"/><watcher var="b" style="normal" x="15.416666666666742" y="143.9916759166667" color="243,118,29" hidden="true"/><watcher var="x" style="normal" x="15.416666666666742" y="186.85001233333338" color="243,118,29" hidden="true"/><watcher var="y" style="normal" x="15.416666666666742" y="229.70834875000003" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="base"><l>65536</l></variable><variable name="a"><l>0</l></variable><variable name="b"><l>0</l></variable><variable name="x"><l>7.52654234263206e+78</l></variable><variable name="y"><l>0</l></variable></variables></scene></scenes></project><media name="text to bignum" app="Snap! 7, https://snap.berkeley.edu" version="2"></media></snapdata>