This commit is contained in:
louiscklaw
2025-01-31 19:28:21 +08:00
parent ce9a4aa9b3
commit 72bacdd6b5
168 changed files with 939668 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
1.如果淨係放嗰個txt file佢唔識encrypt 後output 個encrypt後嘅document .即係我如果delete咗wiki_e.txt佢唔識自己再output。需要人手開一個新txt document
詳情可以睇 Problem1.mp4
2. 1.如果篇文有兩個相同(無論係相同或者多過)字數嘅Alphabet 出現 呢個時候個program就會encrypt錯。例如將「people 」呢隻字打到200字 「P」同「E」嘅數量係一樣
所以encrypt完之後變出嚟嘅亂碼 再decrypt唔會變返「People」所以要搵解決方法做到點樣先可以知道decrypt gen出嚟嘅key(k)係準確。
詳情可以睇Problem2 (Alphabet E is the same with P).mp4 Problem 2( Alphabet P is more than E and the guess of Key is error).mp4
阿sir指定話要將呢個problem寫入report睇下點樣solve同埋點解會出現呢個情況. Thanks very much
3.個Guildline要求無論係Uppercase定LowerCase都要直接將佢變成Uppercase但係只有文字轉Uppercase標點符號同埋spaces唔會改變。
即係gen出嚟嘅亂碼會係全大階。 咁係唔係即係delete咗Lowercase段code就得
4.要加多個flow chart喺report入面係整合曬成個program.
Thanks a lot for helping me.!!!!!!

View File

@@ -0,0 +1,196 @@
#!/usr/bin/env python
import os,sys
ORD_a = ord('a') # 97
ORD_A = ord('A') # 65
def shift_cipher_encrypt(plaintext, key):
# apply encryption to text with given key
encrypted_message = ''
for char in plaintext:
if char.isalpha():
ascii_offset = ORD_A if char.isupper() else ORD_a # Determine ASCII offset based on uppercase or lowercase letter
# the comment shown below are the pseudo code, it demonstrate the ideas only
# let say the input is 'the' // without quote
# find distance of target character with reference to A or a
# i.e. t - a = 19 , h - a = 7 , e - a = 4
distance = ord(char) - ascii_offset
# [19,7,4] + [8,8,8] (key) = [27, 15, 12]
# Shift the character by adding the key and taking modulo 26 to wrap around
# [27,15,12] % [26,26,26] = [1,15,12] // get modules
shifted_distance = (distance + key) % 26
# [1,15,12] + [97,97,97] = [98,112,109]
# chr(98) , chr(112) , chr(109) = 'bpm'
shifted_char = chr(shifted_distance + ascii_offset)
# so: the -> bpm
encrypted_message += shifted_char
else:
# consider integer case, retain
encrypted_message += char
return encrypted_message
def shift_cipher_decrypt(ciphertext, key):
plaintext = ""
for char in ciphertext:
if char.isalpha():
ascii_offset = ORD_a if char.islower() else ORD_A # Determine ASCII offset based on lowercase or uppercase letter
# Calculate the distance of the target character from a or A
distance = ord(char) - ascii_offset
# apply shift, get the remainder of 26
shifted_distance = (distance - key) % 26
# Convert back to ASCII
decrypted_char = chr(shifted_distance + ascii_offset)
plaintext += decrypted_char
else:
# If it is not an alphabetic character, retain as is.
plaintext += char
return plaintext
def count_letter_e(txt_in):
# reserved function for demonstration purpose
occurence = 0
for char in txt_in:
if char.isalpha():
if char.lower() == 'e':
occurence += 1
return occurence
def count_most_occurrence_letter(txt_in):
# letter e, as stated have the most occurrence in the message by statistics.
# as 'Shift Cipher' is a encryption by letter shifting, the letters have good chance
# to have the most occurrence too in the encrypted text.
output = [0] * 26 # bucket for 26 letters
for char in txt_in:
if char.isalpha():
output[ord(char.lower()) - ORD_a] += 1
# output contains the statistics of paragraph letter by letter
return output
def find_max_occurrence(char_occurrences):
# get the letter of the most occurrences. i.e. m
# by subtract between this letter to e, k can be guess
# find max occurrence and its index
max_idx = char_occurrences.index(max(char_occurrences))
# subtract it with index of e -> 4
return max_idx - 4
def encrypt_file(file_path, key=8):
# open a file and apply encryption
output_file = file_path.replace('.txt','_e.txt')
# convert it to integer
key = int(key)
# open source file (plaintext)
with open(file_path,'r',encoding="utf-8") as fi:
temp = ''.join(fi.readlines())
# open target file (encrypted text)
with open(output_file,'a+') as fo:
fo.truncate(0)
fo.writelines([shift_cipher_encrypt(temp, key)])
print(f'encryption done and file saved to {output_file}')
return
def decrypt_file(file_path):
# will open an encrypted file and decrypt it by a guessed key
with open(file_path,'r') as fi:
# beginning of the process
# read file and join the lines all
lines = fi.readlines()
e_temp = ''.join(lines)
characters_distribution = count_most_occurrence_letter(e_temp)
print('')
print('distribution of letters in encrypted text (case insensitive, from a to z)')
print(characters_distribution)
print('')
guess_k = find_max_occurrence(characters_distribution)
print(f'guessed k: {guess_k}')
print('')
print('decrypted text:')
decrypted_text = shift_cipher_decrypt(e_temp, guess_k)
print(decrypted_text)
while True:
# show menu
print()
print("1. Encrypt File")
print("2. Decrypt File")
print("q. quit")
print()
option = input("Select an option (1/2/q): ")
if option == "1":
# run if user want to encrypt file
# check if user entered a file
user_not_enter_file = True
while user_not_enter_file:
file_path = input("Enter the path of the file to encrypt: ")
if len(file_path) > 0:
if os.path.exists(file_path):
user_not_enter_file = False
else:
print('sorry but the file not exist')
else:
print('please enter a file path')
# check if user entered a key
user_not_enter_key = True
while user_not_enter_key:
key = input("Enter the key(k) to encrypt: ")
if (len(key) > 0):
user_not_enter_key = False
else:
print('please enter a key(k)')
if os.path.exists(file_path):
encrypt_file(file_path, key)
print('encryption done')
else:
print("File does not exist.")
elif option == "2":
# run if user want to decrypt file
file_path = input("Enter the path of the file to decrypt: ")
if os.path.exists(file_path):
decrypt_file(file_path)
print('decryption done')
else:
print("File does not exist.")
elif option.lower() == "q":
print('quitting bye ...')
break
else:
print('')
print('ERROR !')
print('please enter either [1/2/q]')
input("press a key to continue ...")
print('')
print("Exiting...")

View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -ex
python ./shift_cipher_encrypter.py

View File

@@ -0,0 +1,8 @@
Ref: https://en.wikipedia.org/wiki/Hong_Kong
Hong Kong was established as a colony of the British Empire after the Qing Empire ceded Hong Kong Island in 18411842. The colony expanded to the Kowloon Peninsula in 1860 and was further extended when the United Kingdom obtained a 99-year lease of the New Territories in 1898. Hong Kong was briefly occupied by Japan from 1941 to 1945 during World War II. The whole territory was transferred from the United Kingdom to China in 1997. Hong Kong maintains separate governing and economic systems from that of mainland China under the principle of "one country, two systems".[f]
Originally a sparsely populated area of farming and fishing villages,[18][19] the territory is now one of the world's most significant financial centres and commercial ports. Hong Kong is the world's fourth-ranked global financial centre, ninth-largest exporter, and eighth-largest importer. Its currency, the Hong Kong dollar, is the eighth most traded currency in the world. Home to the second-highest number of billionaires of any city in the world, Hong Kong has the largest concentration of ultra high-net-worth individuals. Although the city has one of the highest per capita incomes in the world, severe income inequality exists among the population. Despite having the largest number of skyscrapers of any city in the world, housing in Hong Kong has been well-documented to experience a chronic persistent shortage.
Hong Kong is a highly developed territory and has a Human Development Index (HDI) of 0.952, ranking fourth in the world. The city has the second highest life expectancy in the world, and a public transport rate exceeding 90%.
around 261 words

View File

@@ -0,0 +1,8 @@
Sfg: iuuqt://fo.xjljqfejb.psh/xjlj/Ipoh_Lpoh
Ipoh Lpoh xbt ftubcmjtife bt b dpmpoz pg uif Csjujti Fnqjsf bgufs uif Rjoh Fnqjsf dfefe Ipoh Lpoh Jtmboe jo 18411842. Uif dpmpoz fyqboefe up uif Lpxmppo Qfojotvmb jo 1860 boe xbt gvsuifs fyufoefe xifo uif Vojufe Ljohepn pcubjofe b 99-zfbs mfbtf pg uif Ofx Ufssjupsjft jo 1898. Ipoh Lpoh xbt csjfgmz pddvqjfe cz Kbqbo gspn 1941 up 1945 evsjoh Xpsme Xbs JJ. Uif xipmf ufssjupsz xbt usbotgfssfe gspn uif Vojufe Ljohepn up Dijob jo 1997. Ipoh Lpoh nbjoubjot tfqbsbuf hpwfsojoh boe fdpopnjd tztufnt gspn uibu pg nbjomboe Dijob voefs uif qsjodjqmf pg "pof dpvousz, uxp tztufnt".[g]
Psjhjobmmz b tqbstfmz qpqvmbufe bsfb pg gbsnjoh boe gjtijoh wjmmbhft,[18][19] uif ufssjupsz jt opx pof pg uif xpsme't nptu tjhojgjdbou gjobodjbm dfousft boe dpnnfsdjbm qpsut. Ipoh Lpoh jt uif xpsme't gpvsui-sbolfe hmpcbm gjobodjbm dfousf, ojoui-mbshftu fyqpsufs, boe fjhiui-mbshftu jnqpsufs. Jut dvssfodz, uif Ipoh Lpoh epmmbs, jt uif fjhiui nptu usbefe dvssfodz jo uif xpsme. Ipnf up uif tfdpoe-ijhiftu ovncfs pg cjmmjpobjsft pg boz djuz jo uif xpsme, Ipoh Lpoh ibt uif mbshftu dpodfousbujpo pg vmusb ijhi-ofu-xpsui joejwjevbmt. Bmuipvhi uif djuz ibt pof pg uif ijhiftu qfs dbqjub jodpnft jo uif xpsme, tfwfsf jodpnf jofrvbmjuz fyjtut bnpoh uif qpqvmbujpo. Eftqjuf ibwjoh uif mbshftu ovncfs pg tlztdsbqfst pg boz djuz jo uif xpsme, ipvtjoh jo Ipoh Lpoh ibt cffo xfmm-epdvnfoufe up fyqfsjfodf b dispojd qfstjtufou tipsubhf.
Ipoh Lpoh jt b ijhimz efwfmpqfe ufssjupsz boe ibt b Ivnbo Efwfmpqnfou Joefy (IEJ) pg 0.952, sboljoh gpvsui jo uif xpsme. Uif djuz ibt uif tfdpoe ijhiftu mjgf fyqfdubodz jo uif xpsme, boe b qvcmjd usbotqpsu sbuf fydffejoh 90%.
bspvoe 261 xpset