from string import ascii_lowercase as alphabet
class CaesarCypher:
alpha_len = len(alphabet)
min_guess_rate = 0.2
एन्क्रिप्शन और डिक्रिप्शन एक ही सामान है। जब आप शिफ्ट 10 के साथ उदाहरण के लिए डिक्रिप्ट करना चाहते हैं तो इसका मतलब है कि आप इसे 26 - 10 के साथ एन्क्रिप्ट कर सकते हैं। इस मामले में चक्र पूरे वर्णमाला को स्थानांतरित करने के लिए दोहराएगा, यह वही होगा। इसके अलावा मैं ऊपरी केस और गैर वर्ण
def __call__(self, text, offset, encrypt=True):
if not encrypt:
offset = self.alpha_len - offset
result = []
for letter in text:
if not letter.isalpha():
result.append(letter)
continue
letter_to_process = letter.lower()
processed_letter = self._encrypt_letter(letter_to_process, offset)
if letter.isupper():
processed_letter = processed_letter.upper()
result.append(processed_letter)
return ''.join(result)
सभी एन्क्रिप्शन यहां सबसे अधिक चला गया है।
def _encrypt_letter(self, letter, offset=0):
position = (alphabet.find(letter) + offset) % self.alpha_len
return alphabet[position]
यह हिस्सा ब्रूट बल के लिए है और थ्रूग शब्दकोश आवृत्ति अनुमान लगाता है।
@staticmethod
def __how_many_do_i_know(text):
clean_words = filter(lambda x: x.isalpha(), text.split())
clean_words = ['\'{}\''.format(x) for x in clean_words]
cursor = conn.cursor()
query = 'SELECT COUNT(*) FROM mydictionary WHERE word IN ({})'.format(",".join(clean_words))
cursor.execute(query)
response = cursor.fetchone()[0]
return response/len(clean_words)
def guess_encode(self, text):
options = [self(text, offset, encrypt=False) for offset in range(self.alpha_len)]
best_option = [self.__how_many_do_i_know(option) for option in options]
best_key, guess_rate = max(enumerate(best_option), key=lambda x: x[-1])
guess_text = options[best_key]
return best_key, guess_rate, guess_text
स्रोत
2016-09-08 09:52:43
[अजगर 3 सीज़र सिफर कार्यान्वयन] (http://stackoverflow.com/a/26371777/4279) – jfs