added more bases to the solver functions

This commit is contained in:
Stefan Friese 2024-05-05 00:04:19 +02:00
parent 37ee336508
commit edd0c7ffd5
1 changed files with 28 additions and 12 deletions

40
Main.hs
View File

@ -5,8 +5,11 @@ module Main where
import System.Console.CmdArgs import System.Console.CmdArgs
import Control.Arrow import Control.Arrow
import Data.Text (pack, unpack) import Data.Text (pack, unpack)
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Text.Lazy.Builder (toLazyText)
import Data.Text.Encoding (encodeUtf8) import Data.Text.Encoding (encodeUtf8)
import Data.Maybe (fromJust) import Data.Maybe (fromJust, fromMaybe)
import TextShow (toText) import TextShow (toText)
import Text.XML.HXT.DOM.Util (hexStringToInt, intToHexString, decimalStringToInt) import Text.XML.HXT.DOM.Util (hexStringToInt, intToHexString, decimalStringToInt)
import TextShow.Data.Integral (showbBin, showbOct) import TextShow.Data.Integral (showbBin, showbOct)
@ -40,7 +43,6 @@ import qualified Data.ByteString.Char8 as C
import Text.Regex.TDFA import Text.Regex.TDFA
import Data.Word (Word8) import Data.Word (Word8)
import Data.Char (ord, chr) import Data.Char (ord, chr)
import Data.Maybe (fromMaybe)
data Based = Decode { data Based = Decode {
b91 :: Bool, b91 :: Bool,
@ -122,13 +124,13 @@ octToInt (x : xs) = x + 8 * octToInt xs
-- base functions -- base functions
-- without the show func, sequences like \n will not be shown as characters but will be executed as newline -- without the show func, sequences like \n will not be shown as characters but will be executed as newline
-- dec91 :: String -> String
-- dec91 = C.unpack . B91.decode
dec91 :: String -> String dec91 :: String -> String
dec91 input = dec91 = C.unpack . B91.decode
case B91.decode input :: BSU.ByteString of
decoded -> C.unpack decoded -- dec91 :: String -> String
-- dec91 input =
-- case B91.decode input :: BSU.ByteString of
-- decoded -> C.unpack decoded
-- toWord8 :: String -> [Word8] -- toWord8 :: String -> [Word8]
-- toWord8 = map (fromIntegral . fromEnum) -- toWord8 = map (fromIntegral . fromEnum)
@ -230,7 +232,12 @@ enc10 = C.unpack . BSU.fromString . intToHexString . decimalStringToInt -- Depen
dec8 = C.unpack . encodeUtf8 . toText . showbOct . hexStringToInt dec8 = C.unpack . encodeUtf8 . toText . showbOct . hexStringToInt
enc8 = C.unpack . BSU.fromString . intToHexString . octToInt . (reverse . (map fromJust . (map fromOctDigit))) enc8 = C.unpack . BSU.fromString . intToHexString . octToInt . (reverse . (map fromJust . (map fromOctDigit)))
dec2 = C.unpack . encodeUtf8 . toText . showbBin . hexStringToInt
dec2 :: String -> String
-- dec2 = C.unpack . encodeUtf8 . toText . showbBin . hexStringToInt
dec2 = TL.unpack . toLazyText . showbBin . hexStringToInt
enc2 :: String -> String
enc2 = C.unpack . BSU.fromString . intToHexString . binToInt . (reverse . (map fromJust . (map fromBinDigit))) enc2 = C.unpack . BSU.fromString . intToHexString . binToInt . (reverse . (map fromJust . (map fromBinDigit)))
decqp :: String -> String decqp :: String -> String
@ -275,25 +282,34 @@ ency :: String -> String
ency = C.unpack . Y.encode . BSU.fromString ency = C.unpack . Y.encode . BSU.fromString
base91Regex = "^[!-~]*$" base91Regex = "^[!-~]*$"
base85Regex = "^[0-9A-Za-z!#$%&()*+,-;<=>?@^_`{|}~]+$"
-- base85Regex = "^[A-Za-u0-9!\"#$%&((*+,-./;:<=@[]\\`]*$" -- base85Regex = "^[A-Za-u0-9!\"#$%&((*+,-./;:<=@[]\\`]*$"
base64Regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$" base64Regex = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$"
base58Regex = "^[1-9A-HJ-NP-Za-km-z]+$" -- incorrect base58Regex = "^[1-9A-HJ-NP-Za-km-z]+$" -- incorrect
base32Regex = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$" base32Regex = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=)?$"
base16Regex = "^[0-9A-FXx]*$" base16Regex = "^[0-9A-FXx]*$"
base2Regex = "^[01]*$"
urlRegex = "^[a-zA-Z0-9%]*$"
solveEnc :: String -> String solveEnc :: String -> String
solveEnc input = solveEnc input =
let isBase91 = BSU.fromString input =~ base91Regex :: Bool let isBase91 = BSU.fromString input =~ base91Regex :: Bool
isBase85 = BSU.fromString input =~ base85Regex :: Bool
isBase64 = BSU.fromString input =~ base64Regex :: Bool isBase64 = BSU.fromString input =~ base64Regex :: Bool
isBase58 = BSU.fromString input =~ base58Regex :: Bool isBase58 = BSU.fromString input =~ base58Regex :: Bool
isBase32 = BSU.fromString input =~ base32Regex :: Bool isBase32 = BSU.fromString input =~ base32Regex :: Bool
isBase16 = BSU.fromString input =~ base16Regex :: Bool isBase16 = BSU.fromString input =~ base16Regex :: Bool
isBase2 = BSU.fromString input =~ base2Regex :: Bool
isURL = BSU.fromString input =~ urlRegex :: Bool
base91Result = if isBase91 then "\nTrying base91:\n" ++ dec91 input else "" base91Result = if isBase91 then "\nTrying base91:\n" ++ dec91 input else ""
base85Result = if isBase85 then "\nTrying base85:\n" ++ dec85 input else ""
base64Result = if isBase64 then "\nTrying base64:\n" ++ dec64 input else "" base64Result = if isBase64 then "\nTrying base64:\n" ++ dec64 input else ""
base58Result = if isBase58 then "\nTrying base58:\n" ++ dec58 input else "" base58Result = if isBase58 then "\nTrying base58:\n" ++ dec58 input else ""
base32Result = if isBase64 then "\nTrying base32:\n" ++ dec32 input else "" base32Result = if isBase64 then "\nTrying base32:\n" ++ dec32 input else ""
base16Result = if isBase16 then "\nTrying base16:\n" ++ dec16 input else "" base16Result = if isBase16 then "\nTrying base16:\n" ++ dec16 input else ""
results = filter (not . null) [base91Result, base64Result, base32Result, base16Result] base2Result = if isBase2 then "\nTrying base2:\n" ++ dec2 input else ""
urlResult = if isURL then "\nTrying URL decode:\n" ++ decurl input else ""
results = filter (not . null) [base91Result, base85Result, base64Result, base58Result, base32Result, base16Result, base2Result, urlResult]
in in
if null results if null results
then "Not able to solve the encoding.\n" then "Not able to solve the encoding.\n"
@ -337,8 +353,8 @@ optionHandler Decode{b2=True} = dec2
optionHandler Encode{b2=True} = enc2 optionHandler Encode{b2=True} = enc2
optionHandler Decode{qp=True} = decqp optionHandler Decode{qp=True} = decqp
optionHandler Encode{qp=True} = encqp optionHandler Encode{qp=True} = encqp
optionHandler Encode{uu=True} = decuu optionHandler Encode{uu=True} = encuu
optionHandler Decode{uu=True} = encuu optionHandler Decode{uu=True} = decuu
optionHandler Decode{xx=True} = decxx optionHandler Decode{xx=True} = decxx
optionHandler Encode{xx=True} = encxx optionHandler Encode{xx=True} = encxx
optionHandler Decode{yenc=True} = decy optionHandler Decode{yenc=True} = decy