mirror of https://github.com/Ciphey/Ciphey.git
Created Adding your own checker (markdown)
parent
6d0d7d28a1
commit
1e0e20552f
|
@ -0,0 +1,129 @@
|
|||
After reading [this page](https://github.com/Ciphey/Ciphey/wiki/Checkers,-explained) perhaps you want to create your own checkers? This is for you!
|
||||
|
||||
1. Copy and paste the general template:
|
||||
|
||||
```py
|
||||
from typing import Dict, Optional
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from ciphey.iface import Checker, Config, ParamSpec, T, registry
|
||||
|
||||
from collections import Counter
|
||||
|
||||
|
||||
@registry.register
|
||||
class ChiSquared(Checker[str]):
|
||||
|
||||
"""
|
||||
Checks things
|
||||
"""
|
||||
|
||||
def check(self, text: T) -> Optional[str]:
|
||||
return None
|
||||
|
||||
|
||||
def getExpectedRuntime(self, text: T) -> float:
|
||||
# TODO: actually bench this
|
||||
# Uses benchmark from Discord
|
||||
return 2e-7 * len(text)
|
||||
|
||||
def __init__(self, config: Config):
|
||||
super().__init__(config)
|
||||
|
||||
@staticmethod
|
||||
def getParams() -> Optional[Dict[str, ParamSpec]]:
|
||||
pass
|
||||
```
|
||||
|
||||
Change the name to your checker. See this for a working example of a checker:
|
||||
|
||||
```py
|
||||
from typing import Dict, Optional
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from ciphey.iface import Checker, Config, ParamSpec, T, registry
|
||||
|
||||
from collections import Counter
|
||||
|
||||
|
||||
@registry.register
|
||||
class ChiSquared(Checker[str]):
|
||||
|
||||
"""
|
||||
Uses Chi Squared to determine plaintext
|
||||
"""
|
||||
|
||||
def check(self, text: T) -> Optional[str]:
|
||||
print("chi runs")
|
||||
logger.trace("Trying Chi Squared checker")
|
||||
chi_sq = 0.0
|
||||
counts = Counter(text)
|
||||
for i in list(counts.keys()):
|
||||
# If letter is not in dict, don't do it.
|
||||
try:
|
||||
chi_sq = chi_sq + ((counts[i] - self.wordlist[i])**2 / self.wordlist[i])
|
||||
except:
|
||||
continue
|
||||
logger.debug(f"Chi squared is {chi_sq}")
|
||||
logger.debug(chi_sq / len(text))
|
||||
if chi_sq / len(text) > 50.0:
|
||||
print(chi_sq / len(text))
|
||||
return True
|
||||
return None
|
||||
|
||||
|
||||
def getExpectedRuntime(self, text: T) -> float:
|
||||
# TODO: actually bench this
|
||||
# Uses benchmark from Discord
|
||||
return 2e-7 * len(text)
|
||||
|
||||
def __init__(self, config: Config):
|
||||
super().__init__(config)
|
||||
self.wordlist = config.get_resource(self._params()["wordlist"])
|
||||
|
||||
@staticmethod
|
||||
def getParams() -> Optional[Dict[str, ParamSpec]]:
|
||||
return {
|
||||
"wordlist": ParamSpec(
|
||||
desc="A wordlist of all the words",
|
||||
req=False,
|
||||
default="cipheydists::list::english",
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
Next add your checker to:
|
||||
|
||||
```
|
||||
_-init__.py
|
||||
```
|
||||
|
||||
Like so:
|
||||
|
||||
```
|
||||
from . import any, brandon, ezcheck, format, human, quorum, regex, chisquared
|
||||
```
|
||||
|
||||
And finally, go to `ezcheck.py` and add your checker there, basing it on the speed it takes.
|
||||
|
||||
Like so:
|
||||
|
||||
```py
|
||||
# First the flag regexes, as they are the fastest
|
||||
flags_config = config
|
||||
flags_config.update_param("regexlist", "resource", "cipheydists::list::flags")
|
||||
# We do not cache, as this uses a different, on-time config
|
||||
self.checkers.append(RegexList(flags_config))
|
||||
|
||||
# Next, the json checker
|
||||
self.checkers.append(config(JsonChecker))
|
||||
|
||||
self.checkers.append(config(ChiSquared))
|
||||
|
||||
# Finally, the Brandon checker, as it is the slowest
|
||||
self.checkers.append(config(Brandon))
|
||||
```
|
||||
|
||||
Finally, write some tests, run our tests with [Nox](https://nox.thea.codes/en/stable/) and make sure everything is a-okay!
|
Loading…
Reference in New Issue