-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProje.py
175 lines (137 loc) · 4.8 KB
/
Proje.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import os
import binascii
# Bu Fonksiyon Metni binary(ikili) string e dönüştürür.
def toBin(a):
new = ""
for ch in a:
new += bin(ord(ch))[2:].zfill(8)
return new
# Binary stringi metne dönüştürür
def toText(bits, encoding='utf-8', errors='surrogatepass'):
n = int(bits, 2)
return int2bytes(n).decode(encoding, errors)
# string i ikili metne dönüştürmeye yardımcı fonksiyon binascii kütüphanesi kullanıldı
def int2bytes(i):
hex_string = '%x' % i
n = len(hex_string)
return binascii.unhexlify(hex_string.zfill(n + (n & 1)))
# metni 0 lar ile doldurarak 32 bit'li binary ye çevirir.
def to32Bit(x):
if len(x) != 32:
for i in range(0, 32 - len(x)):
x += "0"
return x
return x
# metni 64 bit'li binary sayıya çevirir 0 ile doldurarak
def to64Bit(x):
if (len(x) != 64):
for i in range(0, 64 - len(x)):
x += "0"
return x
return x
'''
metni 2 ye bölerek 1. kısım ve 2.kısım(ikiside 32 bitlik) arasında XOR işlemi yapılır.
'''
def xOR(x, y):
new = ""
for i in range(0, 32):
if x[i] == "0" and y[i] == "0":
new += "0"
if x[i] == "0" and y[i] == "1":
new += "1"
if x[i] == "1" and y[i] == "0":
new += "1"
if x[i] == "1" and y[i] == "1":
new += "0"
return new
'''
Metni ve anahtarı argüman olarak olan bu şifreleme fonksiyonunda anahtar iki eşit parçaya bölünür.
anahtarın ilk kısmı XOR işlemi için ikinci ise bayt miktarını ikiye katlamak için kullanılır.
Şifrele fonksiyonu metni 32 bitlik parçalara bölerek çalışır.
metnin bölünen parçalarının miktarı 2 katına çıkarılır.
Daha sonra ilk kısmın parçalarına XOR İşlemi uygulanır.
Son olarak alınan metnin ilk kısmı ile ikinci kısmı yerdeğiştirilir.
Ve alınan metinden daha uzun ve şifrelenmiş metin sonuç olarak geriye döndürülür.
'''
def encrypt(msg, key):
msg = toBin(msg)
key = toBin(key)
keyList = []
addList = []
temp = ""
for i in range(0, len(key), 32):
if i < len(key) / 2:
temp = key[i:i + 32]
keyList.append(temp)
if i >= len(key) / 2:
temp = key[i:i + 32]
addList.append(temp)
blockList = []
for j in range(0, len(keyList)):
for i in range(0, len(msg), 32):
temp = ""
temp += msg[i:i + 32]
if len(temp) != 32:
temp = to32Bit(temp)
blockList.append(temp)
blockList.append(addList[j])
for i in range(0, len(blockList), 2):
blockList[i] = xOR(blockList[i], keyList[j])
temp = blockList[i]
blockList[i] = blockList[i + 1]
blockList[i + 1] = temp
result = ""
for i in range(0, len(blockList)):
result += blockList[i]
result = toText(result)
return result
'''
Şifre çöz fonksiyonunda anahtar iki eşit parçaya bölünür. ilk kısım XOR işlemine tabi tutulur.
ikinci kısmı bayt miktarını ikiye katlar.
Şifre çözme işlemi XOR' lanan key in kısmı ile ikinci kısmının yer değiştirmesi ile sonuçlanır.
'''
def decrypt(msg, key):
msg = toBin(msg)
key = toBin(key)
keyList = []
temp = ""
for i in range(0, len(key), 32):
if i < len(key) / 2:
temp = key[i:i + 32]
keyList.append(temp)
blockList = []
for i in range(0, len(msg), 32):
temp = ""
temp += msg[i:i + 32]
blockList.append(temp)
for j in range(0, len(keyList)):
for i in range(0, len(blockList), 2):
blockList[i + 1] = xOR(blockList[i + 1], keyList[j])
temp = blockList[i + 1]
blockList[i + 1] = blockList[i]
blockList[i] = temp
result = ""
for i in range(0, len(blockList)):
if i % 2 == 0:
result += blockList[i]
print(len(keyList) * 8)
result = toText(result)
tot = len(result) / len(keyList)
result = result[0:int(tot)]
return result
def main():
msg = input('Sifrelenecek Metni Giriniz:::\n')
key = input('UYARI : ANAHTAR DEGERI OLARAK IKILI YANI 1 VE 0 LARDAN OLUSAN 32 KARAKTERLİ SAYI DIZISI GIRINIZ '
':::\n ANAHTAR ICIN ORNEK SAYI DIZILERI:::: '
'\n01111011011110110111101101111011\n01111010011110100111101001111010\n '
'01111101011111010111110101111101 \n01111110011111100111111001111110\n')
print(msg)
result = encrypt(msg, key)
print(key)
print('Ascii ile Sifrelenmis Metin:::\n', repr(result))
print('Şifrelenmis Metin::: \n' + result)
result = decrypt(result, key)
print('Ascii ile Sifresi Cozulmus Metin:::\n', repr(result))
print('Sifresi Cozulmus Metin::: \n' + result)
main()
os.system("pause")