From 699d792e5bfe9b9084239126791ee61d112beeb2 Mon Sep 17 00:00:00 2001 From: Markus-D-M <105434903+Markus-D-M@users.noreply.github.com> Date: Wed, 25 May 2022 20:57:53 +0200 Subject: [PATCH] Update codingcontracttypes.ts two encryption contracts --- src/data/codingcontracttypes.ts | 232 ++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) diff --git a/src/data/codingcontracttypes.ts b/src/data/codingcontracttypes.ts index b7fce1441..9c76f0481 100644 --- a/src/data/codingcontracttypes.ts +++ b/src/data/codingcontracttypes.ts @@ -1610,4 +1610,236 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ return comprLZDecode(ans) === plain && ans.length <= comprLZEncode(plain).length; }, }, + { + desc: (data: [string, number]): string => { + return [ + "Caesar cipher is one of the simplest encryption technique.", + "It is a type of substitution cipher in which each letter in the plaintext ", + "is replaced by a letter some fixed number of positions down the alphabet.", + "For example, with a left shift of 3, D would be replaced by A, ", + "E would become B, and A would become X (because of rotation).\n\n", + "You are given the following plaintext\n", + `  ${data[0]}\n`, + `and a left shift of ${data[1]}\n\n`, + "Return the ciphertext as uppercase string. Spaces remains the same.", + ].join(" "); + }, + difficulty: 1, + gen: (): [string, number] => { + // return [plaintext, shift value] + const words = [ + "ARRAY", + "CACHE", + "CLOUD", + "DEBUG", + "EMAIL", + "ENTER", + "FLASH", + "FRAME", + "INBOX", + "LINUX", + "LOGIC", + "LOGIN", + "MACRO", + "MEDIA", + "MODEM", + "MOUSE", + "PASTE", + "POPUP", + "PRINT", + "QUEUE", + "SHELL", + "SHIFT", + "TABLE", + "TRASH", + "VIRUS", + ]; + return [ + words + .sort(() => Math.random() - 0.5) + .slice(0, 5) + .join(" "), + Math.floor(Math.random() * 26), + ]; + }, + name: "Encryption I: Caesar Cipher", + numTries: 10, + solver: (data: [string, number], ans: string): boolean => { + // data = [plaintext, shift value] + // build char array, shifting via map and join to final results + const cipher = [...data[0]] + .map((a) => (a === " " ? a : String.fromCharCode(((a.charCodeAt(0) - 65 - data[1] + 26) % 26) + 65))) + .join(""); + return cipher === ans; + }, + }, + { + desc: (data: [string, string]): string => { + return [ + "Vigenère cipher is a type of polyalphabetic substitution. It uses ", + "the Vigenère square to encrypt and decrypt plaintext with a keyword.\n\n", + "  Vignenère square:\n", + "         A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n", + "       +----------------------------------------------------\n", + "     A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n", + "     B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A \n", + "     C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B\n", + "     D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C\n", + "     E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D\n", + "                ...\n", + "     Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X\n", + "     Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y\n\n", + "For encryption each letter of the plaintext is paired with the corresponding letter of a repeating keyword.", + "For example, the plaintext DASHBOARD is encrypted with the keyword LINUX:\n", + "   Plaintext: DASHBOARD\n", + "   Keyword:   LINUXLINU\n", + "So, the first letter D is paired with the first letter of the key L. Therefore, row D and column L of the ", + "Vigenère square are used to get the first cipher letter O. This must be repeated for the whole ciphertext.\n\n", + "You are given the following plaintext\n", + `  ${data[0]}\n`, + `and a keyword ${data[1]}\n\n`, + "Return the ciphertext as uppercase string.", + ].join(" "); + }, + difficulty: 2, + gen: (): [string, string] => { + // return [plaintext, keyword] + const words = [ + "ARRAY", + "CACHE", + "CLOUD", + "DEBUG", + "EMAIL", + "ENTER", + "FLASH", + "FRAME", + "INBOX", + "LINUX", + "LOGIC", + "LOGIN", + "MACRO", + "MEDIA", + "MODEM", + "MOUSE", + "PASTE", + "POPUP", + "PRINT", + "QUEUE", + "SHELL", + "SHIFT", + "TABLE", + "TRASH", + "VIRUS", + ]; + const keys = [ + "ALGORITHM", + "BANDWIDTH", + "BLOGGER", + "BOOKMARK", + "BROADBAND", + "BROWSER", + "CAPTCHA", + "CLIPBOARD", + "COMPUTING", + "COMMAND", + "COMPILE", + "COMPRESS", + "COMPUTER", + "CONFIGURE", + "DASHBOARD", + "DATABASE", + "DESKTOP", + "DIGITAL", + "DOCUMENT", + "DOWNLOAD", + "DYNAMIC", + "EMOTICON", + "ENCRYPT", + "EXABYTE", + "FIREWALL", + "FIRMWARE", + "FLAMING", + "FLOWCHART", + "FREEWARE", + "GIGABYTE", + "GRAPHICS", + "HARDWARE", + "HYPERLINK", + "HYPERTEXT", + "INTEGER", + "INTERFACE", + "INTERNET", + "ITERATION", + "JOYSTICK", + "JUNKMAIL", + "KEYBOARD", + "KEYWORD", + "LURKING", + "MACINTOSH", + "MAINFRAME", + "MALWARE", + "MONITOR", + "NETWORK", + "NOTEBOOK", + "COMPUTER", + "OFFLINE", + "OPERATING", + "PASSWORD", + "PHISHING", + "PLATFORM", + "PODCAST", + "PRINTER", + "PRIVACY", + "PROCESS", + "PROGRAM", + "PROTOCOL", + "REALTIME", + "RESTORE", + "RUNTIME", + "SCANNER", + "SECURITY", + "SHAREWARE", + "SNAPSHOT", + "SOFTWARE", + "SPAMMER", + "SPYWARE", + "STORAGE", + "TERMINAL", + "TEMPLATE", + "TERABYTE", + "TOOLBAR", + "TYPEFACE", + "USERNAME", + "UTILITY", + "VERSION", + "VIRTUAL", + "WEBMASTER", + "WEBSITE", + "WINDOWS", + "WIRELESS", + "PROCESSOR", + ]; + return [ + words + .sort(() => Math.random() - 0.5) + .slice(0, 5) + .join(""), + keys.sort(() => Math.random() - 0.5)[0], + ]; + }, + name: "Encryption II: Vigenère Cipher", + numTries: 10, + solver: (data: [string, string], ans: string): boolean => { + // data = [plaintext, keyword] + // build char array, shifting via map and corresponding keyword letter and join to final results + const cipher = [...data[0]] + .map((a, i) => + (a === " " + ? a + : String.fromCharCode(((a.charCodeAt(0) - 2 * 65 + data[1].charCodeAt(i % data[1].length)) % 26) + 65)), + ) + .join(""); + return cipher === ans; + }, + }, ];