Blog

ROT13

by Dragon on 2025-03-26 03:19:08 UTC

Just a little programming exercise that I thought would be fun, creating a simple shift cipher in multiple programming languages for comparison. <br /><br />First up... PHP<br /><br />[code]<br />function rot13($input) <br />{<br />&nbsp; $output = &quot;&quot;;<br />&nbsp; for ($x = 0; $x &lt; strlen($input); $x++)<br />&nbsp; {<br />&nbsp; &nbsp; $ascii = ord($input[$x]);<br />&nbsp; &nbsp; if ($ascii &gt;= 65 &amp;&amp; $ascii &lt;= 77 || $ascii &gt;= 97 &amp;&amp; $ascii &lt;= 109) { // A-M &amp; a-m<br />&nbsp; &nbsp; &nbsp; $output .= chr($ascii + 13);<br />&nbsp; &nbsp; } else if ($ascii &gt;= 78 &amp;&amp; $ascii &lt;= 90 || $ascii &gt;= 110 &amp;&amp; $ascii &lt;= 122) { // N-Z &amp; n-z<br />&nbsp; &nbsp; &nbsp; $output .= chr($ascii - 13); <br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; $output .= $input[$x];<br />&nbsp; &nbsp; }<br />&nbsp; }<br />&nbsp; return $output;<br />}<br /><br />echo rot13(&#39;Hello World!&#39;) . &#39;&lt;br&gt;&#39;;<br />echo rot13(&#39;AaMmNnZz&#39;) . &#39;&lt;br&gt;&#39;;<br />echo rot13(&#39;ABCDefgHIJKlmnopQRStuvWXyz&#39;) . &#39;&lt;br&gt;&#39;;<br />[/code]<br /><br /><br />Next... C#<br /><br />[code]<br />using System;<br /> <br />public class Program<br />{<br /> public static void Main()<br /> {<br /> Console.WriteLine(rot13(&quot;Hello World!&quot;));<br /> Console.WriteLine(rot13(&quot;AaMmNnZz&quot;));<br /> Console.WriteLine(rot13(&quot;ABCDefgHIJKlmnopQRStuvWXyz&quot;));<br /> }<br /> <br /> public static String rot13(String input) <br /> {<br /> String output = &quot;&quot;;<br /> foreach (var letter in input) <br /> {<br /> int ascii = (int)letter;<br /> if (ascii &gt;= 65 &amp;&amp; ascii &lt;= 77 || ascii &gt;= 97 &amp;&amp; ascii &lt;= 109) { // A-M &amp; a-m<br /> output += (char)(ascii + 13);<br /> } else if (ascii &gt;= 78 &amp;&amp; ascii &lt;= 90 || ascii &gt;= 110 &amp;&amp; ascii &lt;= 122) { // N-Z &amp; n-z<br /> output += (char)(ascii - 13); <br /> } else {<br /> output += letter;<br /> }<br /> }<br /> return output;<br /> }<br />}<br />[/code]<br /><br />...And now, SQL:<br /><br />[code]<br />ALTER FUNCTION dbo.ROT13<br />(<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @PLAINSTRING VARCHAR(255)<br />)<br />RETURNS VARCHAR(255)<br />AS<br />BEGIN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DECLARE @MAX INT = LEN(@PLAINSTRING)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DECLARE @COUNTER INT = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DECLARE @LETTER CHAR(1)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DECLARE @ENCODEDSTRING VARCHAR(255)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHILE (@COUNTER &lt; @MAX)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BEGIN<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @LETTER = SUBSTRING(@PLAINSTRING, @COUNTER+1, 1);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IF(ASCII(@LETTER) BETWEEN 65 AND 77 OR ASCII(@LETTER) BETWEEN 97 AND 109) -- A-M and a-m<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @ENCODEDSTRING = CONCAT(@ENCODEDSTRING, CHAR(ASCII(@LETTER)+13));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ELSE IF(ASCII(@LETTER) BETWEEN 78 AND 90 OR ASCII(@LETTER) BETWEEN 110 AND 122) -- N-Z and n-z<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @ENCODEDSTRING = CONCAT(@ENCODEDSTRING, CHAR(ASCII(@LETTER)-13));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ELSE<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @ENCODEDSTRING = CONCAT(@ENCODEDSTRING, @LETTER);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SET @COUNTER += 1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; END<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RETURN @ENCODEDSTRING<br />END<br />GO<br />[/code]
Nathaniel Dragon