Stream cipher

Dalam stream cipher plaintext dienkrip satu byte tiap waktu. Ini berbeda dengan block cipher (akan dibahas di posting berikutnya) yang harus mengenkrip satu blok byte dengan ukuran tertentu. Prinsip stream cipher adalah: dari sebuah key dihasilkan sebuah urutan byte-byte yang acak. Byte-byte ini kemudian di XOR-kan dengan plaintext. Karena sifat stream cipher yang menghasilkan byte acak, kadang ada yang menggunakan ini sebagai RNG (Random Number Generator)

Dengan stream cipher, panjang hasil enkripsi bisa sama dengan teks yang dienkripsi. Karena enkripsi bisa dilakukan per byte, maka begitu ada 1 byte data tersedia, data tersebut langsung bisa dienkripsi (tidak perlu menunggu satu blok data).

Beberapa contoh stream cipher adalah: RC4 (dipakai di banyak hal misalnya WIFI WEP dan juga oleh banyak malware) serta A5/1 dan A5/2 (dipakai di GSM versi lama). Secara umum block cipher bisa diubah menjadi stream cipher dengan mode OFB (Output Feedback) dan CTR (Counter), jadi sekarang ini tidak banyak stream cipher yang populer.

Baik block cipher maupun stream cipher perlu diberi IV (initialization vector). Tujuan IV ini mirip dengan salt pada waktu hashing. Jika ada dua message yang dienkrip dengan key yang sama, dengan menggunakan IV yang berbeda maka hasil enkripsinya akan berbeda. Dalam stream cipher, jika tidak ada IV dan kita mengenkrip dua pesan yang berbeda (A dan B), maka akibatnya kita bisa mendapatkan (A XOR B) meskipun tidak tahu keynya. Ini bisa terjadi karena

E1 = (A XOR C) # dengan C adalah sebuah stream dari key K
E2 = (B XOR C) # dengan C adalah sebuah stream dari key K yang sama
X = (E1 XOR E2) = (A XOR C) XOR (B XOR C) = A XOR B

Contohnya seperti ini jika data yang dienkrip adalah gambar dengan teks “Yohanes”

Hasilnya bagus tidak terbaca

Berikutnya kita enkrip gambar berisi teks “Risna” dengan key yang sama

Hasilnya seperti ini:

Polanya berbeda (tidak sama) dan tetap tidak terbaca. Tapi jika kita XOR-kan kedua hasil enkripsi tersebut

Hasilnya teksnya muncul, walaupun ada yang overlap. Dalam kasus data biner, jika ada byte 00 di salah satu data, maka itu akan jadi plaintext ketika dilakukan XOR.

Gambar-gambar diatas saya hasilkan dari skrip saya berikut ini

#demo XOR RC4
#Yohanes Nugroho 2019
import os
from PIL import Image
key = "YOHANES"
WIDTH=200
HEIGHT=50
IMG1="image1.png"
IMG2="image2.png"
MERGED="image1+2.png"
gentext1 = "convert -size {0}x{1} -background lightblue -fill blue -pointsize 36 -gravity east label:{2} {3}"
gentext2 = "convert -size {0}x{1} -background lightblue -fill blue -pointsize 36 -gravity west label:{2} {3}"
os.system(gentext1.format(WIDTH, HEIGHT, "Yohanes", IMG1))
os.system(gentext2.format(WIDTH, HEIGHT, "Risna", IMG2))
def load_pixels(img):
im = Image.open(img)
pixels = im.load()
width, height = im.size
all_pixels = []
for x in range(width):
for y in range(height):
r,g,b = pixels[x, y]
all_pixels += [r,g,b]
return all_pixels
def save_pixels(destimage, newpixels):
background = (0, 0, 0, 255)
im = Image.new('RGB', (WIDTH, HEIGHT), background)
width, height = im.size
pixels = im.load()
for x in range(width):
for y in range(height):
r,g,b = newpixels[0:3]
newpixels = newpixels[3:]
pixels[x,y] = (r,g,b)
im.save(destimage)
#RC4 implementation note
#https://github.com/jbremer/rc4/blob/master/LICENSE.txt
def rc4(data, key):
"""RC4 encryption and decryption method."""
S, j, out = list(range(256)), 0, []
for i in range(256):
j = (j + S[i] + ord(key[i % len(key)])) % 256
S[i], S[j] = S[j], S[i]
i = j = 0
for ch in data:
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
out.append(0xff & (ch ^ S[(S[i] + S[j]) % 256]))
return out
def enc_img(image, key):
pixels = load_pixels(image)
enc = rc4(pixels, key)
save_pixels("enc-"+image, enc)
return enc
def enc_xor_img(name, enc1, enc2):
res = []
for i,j in zip(enc1, enc2):
res.append(i^j)
save_pixels(name, res)
enc1 = enc_img(IMG1, key)
enc2 = enc_img(IMG2, key)
enc_xor_img(MERGED, enc1, enc2)

Beberapa cipher tidak mendukung IV(contohnya RC4). Di dalam kasus RC4 (atau yang lain yang tidak memberikan opsi IV), maka kita bisa mencampurkan sendiri IV dengan key (misalnya dengan XOR). Intinya tetap sama.

Demikian penjelasan singkat mengenai Stream Cipher, berikutnya saya akan membahas mengenai Block Cipher.

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.