c-programming

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 70ee4ecf0f2cf358417289c00aa36ed940d96870
parent d98a156332d4986e49d4e49fcc9de831bb497091
Author: Andrew Laack <andrew@laack.co>
Date:   Sat, 11 Oct 2025 22:22:17 -0500

Basic shift cipher for alpha num in c

Diffstat:
M.gitignore | 1+
Acrypto/Makefile | 10++++++++++
Acrypto/shift-cipher.c | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acrypto/test-files/ascii.txt | 264+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 361 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1 +1,2 @@ *.out +*artifacts* diff --git a/crypto/Makefile b/crypto/Makefile @@ -0,0 +1,10 @@ +clean: + rm -rf artifacts +shift-cipher: clean + tcc shift-cipher.c -o shift.out +test-shift-cipher: shift-cipher + mkdir artifacts + ./shift.out test-files/ascii.txt artifacts/ascii-encrypted.txt 200 + ./shift.out artifacts/ascii-encrypted.txt artifacts/ascii.txt -200 + sha256sum artifacts/ascii.txt test-files/ascii.txt + # Do the checksums match? This tests that invariant diff --git a/crypto/shift-cipher.c b/crypto/shift-cipher.c @@ -0,0 +1,86 @@ +#include <stdio.h> +#include <stdbool.h> +#include <stdlib.h> +#include <ctype.h> + +char rotate(char in, int rotateBy){ + char result = in; + + if( islower(in) ){ + char offset = in - 'a'; + int res = offset + rotateBy; + while(res < 0){ + res += 26; + } + result = ((res) % 26) + 'a'; + } + else if( isupper(in) ){ + char offset = in - 'A'; + if(offset < 0){ + offset += 26; + } + int res = offset + rotateBy; + while(res < 0){ + res += 26; + } + result = ((res) % 26) + 'A'; + + } + else if (isalnum(in)){ + char offset = in - '0'; + if(offset < 0){ + offset += 10; + } + int res = offset + rotateBy; + while(res < 0){ + res += 10; + } + result = ((res) % 10) + '0'; + } + + return result; +} + +int main(int argc, char *argv[]){ + + int opt; + + + + if (argc < 4){ + printf("Usage: shift {input_file} {output_file} {rotate_by}\n"); + return -1; + } + + char* inputFileName; + inputFileName = argv[1]; + + char* outputFileName; + outputFileName = argv[2]; + + + int rotateBy = atoi(argv[3]); + + FILE *fptr = fopen(inputFileName, "r"); + + if (fptr == NULL){ + printf("Bad input file. \n"); + return -1; + } + + FILE *outPtr = fopen(outputFileName, "w"); + + int readIn = 100; + char next[readIn]; + char nextCipher[readIn]; + + while(fgets(next, readIn, fptr)){ + for (int itr = 0; next[itr] != 0; ++itr){ + nextCipher[itr] = rotate(next[itr], rotateBy); + fputc(nextCipher[itr], outPtr); + } + } + + fclose(fptr); + fclose(outPtr); +} diff --git a/crypto/test-files/ascii.txt b/crypto/test-files/ascii.txt @@ -0,0 +1,264 @@ + +ASCII control characters non printable : + +ASCII code 00 = NULL ( Null character ) +ASCII code 01 = SOH ( Start of Header ) +ASCII code 02 = STX ( Start of Text ) +ASCII code 03 = ETX ( End of Text, hearts card suit ) +ASCII code 04 = EOT ( End of Transmission, diamonds card suit ) +ASCII code 05 = ENQ ( Enquiry, clubs card suit ) +ASCII code 06 = ACK ( Acknowledgement, spade card suit ) +ASCII code 07 = BEL ( Bell ) +ASCII code 08 = BS ( Backspace ) +ASCII code 09 = HT ( Horizontal Tab ) +ASCII code 10 = LF ( Line feed ) +ASCII code 11 = VT ( Vertical Tab, male symbol, symbol for Mars ) +ASCII code 12 = FF ( Form feed, female symbol, symbol for Venus ) +ASCII code 13 = CR ( Carriage return ) +ASCII code 14 = SO ( Shift Out ) +ASCII code 15 = SI ( Shift In ) +ASCII code 16 = DLE ( Data link escape ) +ASCII code 17 = DC1 ( Device control 1 ) +ASCII code 18 = DC2 ( Device control 2 ) +ASCII code 19 = DC3 ( Device control 3 ) +ASCII code 20 = DC4 ( Device control 4 ) +ASCII code 21 = NAK ( NAK Negative-acknowledge ) +ASCII code 22 = SYN ( Synchronous idle ) +ASCII code 23 = ETB ( End of trans. block ) +ASCII code 24 = CAN ( Cancel ) +ASCII code 25 = EM ( End of medium ) +ASCII code 26 = SUB ( Substitute ) +ASCII code 27 = ESC ( Escape ) +ASCII code 28 = FS ( File separator ) +ASCII code 29 = GS ( Group separator ) +ASCII code 30 = RS ( Record separator ) +ASCII code 31 = US ( Unit separator ) +ASCII code 127 = DEL ( Delete ) +Printable ASCII characters : +( alphanumeric, symbols and signs ) + +ASCII code 32 = space ( Space ) +ASCII code 33 = ! ( Exclamation mark ) +ASCII code 34 = " ( Double quotes ; Quotation mark ; speech marks ) +ASCII code 35 = # ( Number sign ) +ASCII code 36 = $ ( Dollar sign ) +ASCII code 37 = % ( Percent sign ) +ASCII code 38 = & ( Ampersand ) +ASCII code 39 = ' ( Single quote or Apostrophe ) +ASCII code 40 = ( ( round brackets or parentheses, opening round bracket ) +ASCII code 41 = ) ( parentheses or round brackets, closing parentheses ) +ASCII code 42 = * ( Asterisk ) +ASCII code 43 = + ( Plus sign ) +ASCII code 44 = , ( Comma ) +ASCII code 45 = - ( Hyphen , minus sign ) +ASCII code 46 = . ( Dot, full stop ) +ASCII code 47 = / ( Slash , forward slash , fraction bar , division slash ) +ASCII code 48 = 0 ( number zero ) +ASCII code 49 = 1 ( number one ) +ASCII code 50 = 2 ( number two ) +ASCII code 51 = 3 ( number three ) +ASCII code 52 = 4 ( number four ) +ASCII code 53 = 5 ( number five ) +ASCII code 54 = 6 ( number six ) +ASCII code 55 = 7 ( number seven ) +ASCII code 56 = 8 ( number eight ) +ASCII code 57 = 9 ( number nine ) +ASCII code 58 = : ( Colon ) +ASCII code 59 = ; ( Semicolon ) +ASCII code 60 = < ( Less-than sign ) +ASCII code 61 = = ( Equals sign ) +ASCII code 62 = > ( Greater-than sign ; Inequality ) +ASCII code 63 = ? ( Question mark ) +ASCII code 64 = @ ( At sign ) +ASCII code 65 = A ( Capital letter A ) +ASCII code 66 = B ( Capital letter B ) +ASCII code 67 = C ( Capital letter C ) +ASCII code 68 = D ( Capital letter D ) +ASCII code 69 = E ( Capital letter E ) +ASCII code 70 = F ( Capital letter F ) +ASCII code 71 = G ( Capital letter G ) +ASCII code 72 = H ( Capital letter H ) +ASCII code 73 = I ( Capital letter I ) +ASCII code 74 = J ( Capital letter J ) +ASCII code 75 = K ( Capital letter K ) +ASCII code 76 = L ( Capital letter L ) +ASCII code 77 = M ( Capital letter M ) +ASCII code 78 = N ( Capital letter N ) +ASCII code 79 = O ( Capital letter O ) +ASCII code 80 = P ( Capital letter P ) +ASCII code 81 = Q ( Capital letter Q ) +ASCII code 82 = R ( Capital letter R ) +ASCII code 83 = S ( Capital letter S ) +ASCII code 84 = T ( Capital letter T ) +ASCII code 85 = U ( Capital letter U ) +ASCII code 86 = V ( Capital letter V ) +ASCII code 87 = W ( Capital letter W ) +ASCII code 88 = X ( Capital letter X ) +ASCII code 89 = Y ( Capital letter Y ) +ASCII code 90 = Z ( Capital letter Z ) +ASCII code 91 = [ ( square brackets or box brackets, opening bracket ) +ASCII code 92 = \ ( Backslash , reverse slash ) +ASCII code 93 = ] ( box brackets or square brackets, closing bracket ) +ASCII code 94 = ^ ( Circumflex accent or Caret ) +ASCII code 95 = _ ( underscore , understrike , underbar or low line ) +ASCII code 96 = ` ( Grave accent ) +ASCII code 97 = a ( Lowercase letter a , minuscule a ) +ASCII code 98 = b ( Lowercase letter b , minuscule b ) +ASCII code 99 = c ( Lowercase letter c , minuscule c ) +ASCII code 100 = d ( Lowercase letter d , minuscule d ) +ASCII code 101 = e ( Lowercase letter e , minuscule e ) +ASCII code 102 = f ( Lowercase letter f , minuscule f ) +ASCII code 103 = g ( Lowercase letter g , minuscule g ) +ASCII code 104 = h ( Lowercase letter h , minuscule h ) +ASCII code 105 = i ( Lowercase letter i , minuscule i ) +ASCII code 106 = j ( Lowercase letter j , minuscule j ) +ASCII code 107 = k ( Lowercase letter k , minuscule k ) +ASCII code 108 = l ( Lowercase letter l , minuscule l ) +ASCII code 109 = m ( Lowercase letter m , minuscule m ) +ASCII code 110 = n ( Lowercase letter n , minuscule n ) +ASCII code 111 = o ( Lowercase letter o , minuscule o ) +ASCII code 112 = p ( Lowercase letter p , minuscule p ) +ASCII code 113 = q ( Lowercase letter q , minuscule q ) +ASCII code 114 = r ( Lowercase letter r , minuscule r ) +ASCII code 115 = s ( Lowercase letter s , minuscule s ) +ASCII code 116 = t ( Lowercase letter t , minuscule t ) +ASCII code 117 = u ( Lowercase letter u , minuscule u ) +ASCII code 118 = v ( Lowercase letter v , minuscule v ) +ASCII code 119 = w ( Lowercase letter w , minuscule w ) +ASCII code 120 = x ( Lowercase letter x , minuscule x ) +ASCII code 121 = y ( Lowercase letter y , minuscule y ) +ASCII code 122 = z ( Lowercase letter z , minuscule z ) +ASCII code 123 = { ( braces or curly brackets, opening braces ) +ASCII code 124 = | ( vertical-bar, vbar, vertical line or vertical slash ) +ASCII code 125 = } ( curly brackets or braces, closing curly brackets ) +ASCII code 126 = ~ ( Tilde ; swung dash ) +ASCII Extended Characters : + +ASCII code 128 = Ç ( Majuscule C-cedilla ) +ASCII code 129 = ü ( letter u with umlaut or diaeresis , u-umlaut ) +ASCII code 130 = é ( letter e with acute accent or e-acute ) +ASCII code 131 = â ( letter a with circumflex accent or a-circumflex ) +ASCII code 132 = ä ( letter a with umlaut or diaeresis , a-umlaut ) +ASCII code 133 = à ( letter a with grave accent ) +ASCII code 134 = å ( letter a with a ring ) +ASCII code 135 = ç ( Minuscule c-cedilla ) +ASCII code 136 = ê ( letter e with circumflex accent or e-circumflex ) +ASCII code 137 = ë ( letter e with umlaut or diaeresis ; e-umlauts ) +ASCII code 138 = è ( letter e with grave accent ) +ASCII code 139 = ï ( letter i with umlaut or diaeresis ; i-umlaut ) +ASCII code 140 = î ( letter i with circumflex accent or i-circumflex ) +ASCII code 141 = ì ( letter i with grave accent ) +ASCII code 142 = Ä ( letter A with umlaut or diaeresis ; A-umlaut ) +ASCII code 143 = Å ( Capital letter A with a ring ) +ASCII code 144 = É ( Capital letter E with acute accent or E-acute ) +ASCII code 145 = æ ( Latin diphthong ae in lowercase ) +ASCII code 146 = Æ ( Latin diphthong AE in uppercase ) +ASCII code 147 = ô ( letter o with circumflex accent or o-circumflex ) +ASCII code 148 = ö ( letter o with umlaut or diaeresis ; o-umlaut ) +ASCII code 149 = ò ( letter o with grave accent ) +ASCII code 150 = û ( letter u with circumflex accent or u-circumflex ) +ASCII code 151 = ù ( letter u with grave accent ) +ASCII code 152 = ÿ ( Lowercase letter y with diaeresis ) +ASCII code 153 = Ö ( Letter O with umlaut or diaeresis ; O-umlaut ) +ASCII code 154 = Ü ( Letter U with umlaut or diaeresis ; U-umlaut ) +ASCII code 155 = ø ( Lowercase slashed zero or empty set ) +ASCII code 156 = £ ( Pound sign ; symbol for the pound sterling ) +ASCII code 157 = Ø ( Uppercase slashed zero or empty set ) +ASCII code 158 = × ( Multiplication sign ) +ASCII code 159 = ƒ ( Function sign ; f with hook sign ; florin sign ) +ASCII code 160 = á ( Lowercase letter a with acute accent or a-acute ) +ASCII code 161 = í ( Lowercase letter i with acute accent or i-acute ) +ASCII code 162 = ó ( Lowercase letter o with acute accent or o-acute ) +ASCII code 163 = ú ( Lowercase letter u with acute accent or u-acute ) +ASCII code 164 = ñ ( eñe, enie, spanish letter enye, lowercase n with tilde ) +ASCII code 165 = Ñ ( Spanish letter enye, uppercase N with tilde, EÑE, enie ) +ASCII code 166 = ª ( feminine ordinal indicator ) +ASCII code 167 = º ( masculine ordinal indicator ) +ASCII code 168 = ¿ ( Inverted question marks ) +ASCII code 169 = ® ( Registered trademark symbol ) +ASCII code 170 = ¬ ( Logical negation symbol ) +ASCII code 171 = ½ ( One half ) +ASCII code 172 = ¼ ( Quarter, one fourth ) +ASCII code 173 = ¡ ( Inverted exclamation marks ) +ASCII code 174 = « ( Angle quotes, guillemets, right-pointing quotation mark ) +ASCII code 175 = » ( Guillemets, angle quotes, left-pointing quotation marks ) +ASCII code 176 = ░ ( Graphic character, low density dotted ) +ASCII code 177 = ▒ ( Graphic character, medium density dotted ) +ASCII code 178 = ▓ ( Graphic character, high density dotted ) +ASCII code 179 = │ ( Box drawing character single vertical line ) +ASCII code 180 = ┤ ( Box drawing character single vertical and left line ) +ASCII code 181 = Á ( Capital letter A with acute accent or A-acute ) +ASCII code 182 = Â ( Letter A with circumflex accent or A-circumflex ) +ASCII code 183 = À ( Letter A with grave accent ) +ASCII code 184 = © ( Copyright symbol ) +ASCII code 185 = ╣ ( Box drawing character double line vertical and left ) +ASCII code 186 = ║ ( Box drawing character double vertical line ) +ASCII code 187 = ╗ ( Box drawing character double line upper right corner ) +ASCII code 188 = ╝ ( Box drawing character double line lower right corner ) +ASCII code 189 = ¢ ( Cent symbol ) +ASCII code 190 = ¥ ( YEN and YUAN sign ) +ASCII code 191 = ┐ ( Box drawing character single line upper right corner ) +ASCII code 192 = └ ( Box drawing character single line lower left corner ) +ASCII code 193 = ┴ ( Box drawing character single line horizontal and up ) +ASCII code 194 = ┬ ( Box drawing character single line horizontal down ) +ASCII code 195 = ├ ( Box drawing character single line vertical and right ) +ASCII code 196 = ─ ( Box drawing character single horizontal line ) +ASCII code 197 = ┼ ( Box drawing character single line horizontal vertical ) +ASCII code 198 = ã ( Lowercase letter a with tilde or a-tilde ) +ASCII code 199 = Ã ( Capital letter A with tilde or A-tilde ) +ASCII code 200 = ╚ ( Box drawing character double line lower left corner ) +ASCII code 201 = ╔ ( Box drawing character double line upper left corner ) +ASCII code 202 = ╩ ( Box drawing character double line horizontal and up ) +ASCII code 203 = ╦ ( Box drawing character double line horizontal down ) +ASCII code 204 = ╠ ( Box drawing character double line vertical and right ) +ASCII code 205 = ═ ( Box drawing character double horizontal line ) +ASCII code 206 = ╬ ( Box drawing character double line horizontal vertical ) +ASCII code 207 = ¤ ( Generic currency sign ) +ASCII code 208 = ð ( Lowercase letter eth ) +ASCII code 209 = Ð ( Capital letter Eth ) +ASCII code 210 = Ê ( Letter E with circumflex accent or E-circumflex ) +ASCII code 211 = Ë ( Letter E with umlaut or diaeresis, E-umlaut ) +ASCII code 212 = È ( Capital letter E with grave accent ) +ASCII code 213 = ı ( Lowercase dot less i ) +ASCII code 214 = Í ( Capital letter I with acute accent or I-acute ) +ASCII code 215 = Î ( Letter I with circumflex accent or I-circumflex ) +ASCII code 216 = Ï ( Letter I with umlaut or diaeresis ; I-umlaut ) +ASCII code 217 = ┘ ( Box drawing character single line lower right corner ) +ASCII code 218 = ┌ ( Box drawing character single line upper left corner ) +ASCII code 219 = █ ( Block, graphic character ) +ASCII code 220 = ▄ ( Bottom half block ) +ASCII code 221 = ¦ ( Vertical broken bar ) +ASCII code 222 = Ì ( Capital letter I with grave accent ) +ASCII code 223 = ▀ ( Top half block ) +ASCII code 224 = Ó ( Capital letter O with acute accent or O-acute ) +ASCII code 225 = ß ( Letter Eszett ; scharfes S or sharp S ) +ASCII code 226 = Ô ( Letter O with circumflex accent or O-circumflex ) +ASCII code 227 = Ò ( Capital letter O with grave accent ) +ASCII code 228 = õ ( Lowercase letter o with tilde or o-tilde ) +ASCII code 229 = Õ ( Capital letter O with tilde or O-tilde ) +ASCII code 230 = µ ( Lowercase letter Mu ; micro sign or micron ) +ASCII code 231 = þ ( Lowercase letter Thorn ) +ASCII code 232 = Þ ( Capital letter Thorn ) +ASCII code 233 = Ú ( Capital letter U with acute accent or U-acute ) +ASCII code 234 = Û ( Letter U with circumflex accent or U-circumflex ) +ASCII code 235 = Ù ( Capital letter U with grave accent ) +ASCII code 236 = ý ( Lowercase letter y with acute accent ) +ASCII code 237 = Ý ( Capital letter Y with acute accent ) +ASCII code 238 = ¯ ( Macron symbol ) +ASCII code 239 = ´ ( Acute accent ) +ASCII code 240 = ≡ ( Congruence relation symbol ) +ASCII code 241 = ± ( Plus-minus sign ) +ASCII code 242 = ‗ ( underline or underscore ) +ASCII code 243 = ¾ ( three quarters, three-fourths ) +ASCII code 244 = ¶ ( Paragraph sign or pilcrow ; end paragraph mark ) +ASCII code 245 = § ( Section sign ) +ASCII code 246 = ÷ ( The division sign ; Obelus ) +ASCII code 247 = ¸ ( cedilla ) +ASCII code 248 = ° ( Degree symbol ) +ASCII code 249 = ¨ ( Diaresis ) +ASCII code 250 = · ( Interpunct or space dot ) +ASCII code 251 = ¹ ( Superscript one, exponent 1, first power ) +ASCII code 252 = ³ ( Superscript three, exponent 3, cube, third power ) +ASCII code 253 = ² ( Superscript two, exponent 2, square, second power ) +ASCII code 254 = ■ ( black square ) +ASCII code 255 = nbsp ( Non-breaking space or no-break space )