Előző - #40 Két rendezett lista egyesítése | Tartalomjegyzék | Következő - #42 Buborékrendezés
rot13('Hello, world!') → 'Uryyb, jbeyq!'
rot13('Uryyb, jbeyq!') → 'Szia, világ!'
A ROT 13 egy egyszerű titkosítási kód . A „ROT 13” név a „rotate 13” rövidítése. A titkosítást úgy végzi, hogy a betűket olyan betűkre cseréli, amelyek 13 karakterrel lejjebb jelennek meg az ábécé szerint: A helyett N, B helyett O, C helyén P, és így tovább. Ha ez a 13 betűből álló forgatás áthalad az ábécé végén, akkor „körültekeri” a Z-t, és az ábécé elejétől folytatódik. Így X helyére K, Y helyére L, Z helyére M, és így tovább. A nem betű karakterek titkosítatlanul maradnak.
A ROT 13 előnye, hogy visszafejtheti a titkosított szöveget, ha újra átfutja a ROT 13 titkosításon. Ez 26-szor elforgatja a levelet, visszaállítva az eredeti betűt. Szóval "Szia, világ!" titkosítja az „Uryyb, jbeyq!” ami viszont titkosítja a „Hello, world!” kódot. Nincs visszafejtési algoritmus; a titkosított szöveget az újbóli titkosítással dekódolja. A ROT 13 algoritmus nem biztonságos a valós kriptográfiához. De használható a szöveg elhomályosítására, hogy megakadályozza a viccek ütési vonalainak vagy a rejtvénymegoldások elrontását.
Az alábbiakban bemutatjuk, hogy a 26 betű mindegyike mit titkosít a ROT 13-mal egyszer (a felső sortól a középső sorig) és kétszer (a középső sortól az alsó sorig).
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 O P Q R S T U V W X Y Z A B C D E F G H I J K L M
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
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
Gyakorlat leírása
Írjon egy rot13()függvényt szöveges paraméterrel, amely a ROT 13 titkosított változatát adja vissza text. A nagybetűk nagybetűvé, a kisbetűk pedig kisbetűvé titkosítják. Például: 'HELLO, világ!' titkosítja az 'URYYB, jbeyq!' és 'hello, WORLD!'titkosítja az "uryyb, JBEYQ!" .
A következő Python-függvényeket és karakterlánc-metódusokat használhatja a megoldás részeként: ord(), chr(), isalpha(), islower(), és isupper().
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :
assert rot13('Hello, world!') == 'Uryyb, jbeyq!'
assert rot13('Uryyb, jbeyq!') == 'Szia, világ!'
assert rot13(rot13('Hello, world!')) == 'Szia, világ!'
assert rot13('abcdefghijklmnopqrstuvwxyz') == 'nopqrstuvwxyzabcdefghijklm'
assert rot13('ABCDEFGHIJKLMNOPQRSTUVWXYZ') == 'NOPQRSTUVWXYZABCDEFGHIJKLM'
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: karakterláncok, ord(), chr(), forciklusok, logikai operátorok, islower(), isupper(), kiterjesztett hozzárendelési operátorok
Megoldás tervezése
Ahelyett, hogy minden betűt és annak titkosított formáját keményen kódolnánk, támaszkodhatunk az egyes betűk Unicode kódpontjának egészére. A kódpontokat a 7. gyakorlat, „ASCII táblázat” tárgyalta. A 7. gyakorlatban tárgyalt ord() és chr()függvények, az „ASCII-tábla” betűsorból egész számra, illetve egész szám betűsorra fordíthatók.
A függvény encryptedText egy üres karakterláncra beállított változóval kezdődik, amely tárolja a titkosított eredményt, amikor minden karaktert titkosítunk. Egy forhurok áthaladhat a textparaméteren az egyes karakterek titkosításához. Ha ez a karakter nem betű, akkor encryptedText titkosítás nélkül hozzáadódik a „as-is” végéhez .
Ellenkező esetben átadhatjuk a betűt a következőnek, hogy ord() megkapjuk a Unicode kódpontját egész számként. A nagybetűk A-tól Z-ig 65-től 90-ig terjedő egész számokat tartalmaznak. A kisbetűk a-tól z-ig 97-től 122-ig terjedő egész számokat tartalmaznak. Ezt 26-tal kell csökkentenünk, hogy az ábécé elejére kerüljön. .
Például a betűnek 'S'van egy egész száma 83(mert ord('S') visszaadja 83), de ha összeadjuk 83 + 13 , 96akkor , ami nagyobb, mint a Z egész szám ( ord('Z')visszatér 90). Ebben az esetben ki kell vonnunk 26: 96-26 megadja a titkosított egész számot 70, a chr(70) pedig 'F'. Így határozhatjuk meg, hogy a ROT 13 titkosításban 'F''S' -re titkosít .
Ne feledje, hogy míg a nagybetűknek 'Z'van Unicode kódpontja 90, addig a kis "z" betűnek az Unicode kódpontja 122.
Különleges esetek és Gotchák
While you want to add 13 to the Unicode code point integers of both uppercase and lowercase letters, when you check if this addition results in a number larger than Z’s Unicode code point, you must use the correct case of Z. Otherwise, your rot13() function may determine that the lowercase 'a' (with integer 97) is past uppercase 'Z' (with integer 90) because 97 is greater than 90. You must compare lowercase rotated letters with 122 (the integer of lowercase 'z') and uppercase rotated letters with 90 (the integer of uppercase 'Z').
All non-letter characters such as numbers, spaces, and punctuation marks are added to the encrypted text unmodified. Be sure that your rot13() function doesn’t accidentally drop them from the returned string.
Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.
Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/rot13-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def rot13(text):
# Create an encryptedText variable to store the encrypted string:
encryptedText = ____
# Loop over each character in the text:
for character in text:
# If the character is not a letter, add it as-is to encryptedText:
if not character.____():
encryptedText += ____
# Otherwise calculate the letter's "rotated 13" letter:
else:
rotatedLetterOrdinal = ____(character) + 13
# If adding 13 pushes the letter past Z, subtract 26:
if ____.islower() and rotatedLetterOrdinal > ____:
rotatedLetterOrdinal -= ____
if ____.isupper() and rotatedLetterOrdinal > ____:
rotatedLetterOrdinal -= ____
# Add the encrypted letter to encryptedText:
encryptedText += ____(rotatedLetterOrdinal)
# Return the encrypted text:
return encryptedText
The complete solution for this exercise is given in Appendix A and https://invpy.com/rot13.py. You can view each step of this program as it runs under a debugger at https://invpy.com/rot13-debug/.
Further Reading
If you are interested in writing Python programs for encryption algorithms and code breaking, my book “Cracking Codes with Python” is freely available under a Creative Commons license at https://inventwithpython.com/cracking/.
Prev - #40 Merging Two Sorted Lists | Table of Contents | Next - #42 Bubble Sort