Vissza

6. labor

  1. Generáljunk véletlenszerűen egy-egy n bites számot és határozzuk meg a két szám bitenkénti AND, OR, XOR értékeit, majd határozzuk meg, hogy a kapott eredményekben, mennyi a különbség az 1-es és 0-ás bitek száma között. Több számpárra is végezzük el a vizsgálatot! Mit veszünk észre?
  2. A tanult két módszerrel határozzuk meg, hogy hány 1-es bit van 2n, 2n-1, 2n+1 számokban, illetve egy véletlenszerűen generált n-bites számban, ahol n >= 106. Mérjük le a számításokhoz szükséges futási időt.
  3. Írjunk programot, amely egy bináris állomány bájtjainak megfelelő hexa, illetve bináris értékeit kiírja egy szövegállományba. A hexa formátum esetében minden értéket két szimbólummal és egy space-el, bináris formátum esetén minden értéket 8 szimbólummal és egy space-el jelenítsünk meg. Egy sorba hexa formátum esetén 16 értéket, a bináris formátum esetén pedig 4 értéket tegyünk.
  4. A 3. feladatnál létrehozott szövegállományt alakítsuk vissza a megfelelő bináris állománnyá.
  5. Írjuk ki egy szövegállományba, formázva a nyomtatható ASCII karaktereket.
  6. Nagybetűsítsük egy szövegállomány tartalmát, azaz minden kis angol ábécébeli betűt alakítsunk át nagybetűvé a többit, hagyjuk változatlanul.
  7. Határozzuk meg hogy egy szövegállományban hány nyomtatható karakter van.
  8. Írjunk programot, amely titkosítja a megadott bináris állományt, XOR műveletet használva. A titkosításhoz használt jelszót véletlenszerűen állítsuk elő.
  9. Olvassunk be egy tetszőleges karakterláncot a billentyűzetről és határozzuk meg a base64-es alakját.
  10. Generáljunk véletlenszerűen egy n (n >= 1024) bites számot, alakítsuk át 256-os számrendszerbe, határozzuk meg a base64-es alakját és az eredményt írjuk ki egy állományba. Írjuk meg a visszaalakító műveletsort is: olvassuk ki az állámányból a kódolt szöveget, dekódoljuk, majd a kapott 256-os számrendszerbeli "számot" alakítsuk vissza 10-es számrendszerbe.
  11. Titkosítsunk a tanult technikával, az XOR műveletet használva, egy 2Mbnál nagyobb bináris állományt, ahol a kulcsot véletlenszerűen generáljuk. A generált kulcs base64-es alakját írjuk ki egy kulcs.txt szövegállományba, majd a visszafejtéshez a kulcs.txt állományba levő értéket használjuk.
  12. A cryptXOR állomány egy pdf állomány titkosított értéke, ahol a titkosított állomány, a tanult technikával, az XOR műveletet használva lett előállítva. Az adatokXOR.txt állomány több személynevet és a hozzájuk tartozó kulcs értékét tartalmazza, ahol a kulcs értékek base64-es alakja lett elmentve. Írjunk Python programot, amely megmondja, hogy kinek a kulcsával volt a titkosítás elvégezve, meghatározva a kulcsot és meghatározva az eredeti pdf-t is, tudva, hogy egy pdf első négy bájtja mindig a következő: 0x25, 0x50, 0x44, 0x46.
  13. Írjunk Python függvényt, amely az előadáson bemutatott base64 kódoló és dekódoló függvényeket átírja C/C++ nyelvre.

Megoldott feladatok
1. Generáljunk véletlenszerűen egy pontosan n-bites számot és határozzuk meg a bináris alakját.
import random
def nBits(n):
b1 = 1 << (n-1)
b2 = (1 << n) - 1
nr = random.randint(b1, b2)
print(nr, format(nr, 'b'))

2. A tanult két módszerrel (HammingW1, HammingW2 határozzuk meg, hogy hány 1-es bit van egy véletlenszerűen generált, maximum n-bites számban, illetve határozzuk meg, hogy mennyi a számításokhoz szükséges futási idő.
import random, time
def fel(n):
nr = random.getrandbits(n)
st = time.time()
res = HammingW1(nr)
fs = time.time()
print (res, fs - st)

st = time.time()
res = HammingW2(nr)
fs = time.time()
print (res, fs - st)

def HammingW1(nr):
db = 0
while nr:
db += (nr & 1)
nr >>= 1
return db

def HammingW2(nr):
db = 0
while nr:
nr &= nr - 1
db += 1
return db

3. Base64:
>>> from base64 import b64encode, b64decode
>>> b64encode('Sapientia'.encode())
b'U2FwaWVudGlh'
>>> b64encode('Sap'.encode())
b'U2Fw'
>>> b64encode('Sapi'.encode())
b'U2FwaQ=='
>>> b64encode('műszaki'.encode())
b'bcWxc3pha2k='
>>> b64encode('műszaki'.encode()).decode()
'bcWxc3pha2k='
>>> b64decode('U2FwaWVudGlh')
b'Sapientia'
>>> b64decode('U2FwaWVudGlh').decode
'Sapientia'