from cryptography.fernet import Fernet.
def get_key():
key = input("Anahtar: ")
return key.
def encrypt(message):
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(message)
print(f"Çıktı: {token} \nAnahtar: {key} \n")
def decrypt(message, key):
f = Fernet(key)
token = f.decrypt(message)
print(f"Mesaj: {token}\n")
while True:
get = input("1 (Şifrele) mi 2 (Şifre Çöz) mü? > ")
if get == "1":
message = input("Mesaj: ")
message = bytes(message, "utf-8")
encrypt(message)
elif get == "2":
message = input("Mesaj: ")
key = get_key()
decrypt(message, key)
else:
print("Yanlış Seçim")
Bu kod da encrypt ile aldığım şifreyi decrypt üzerinde kullandığımda "ValueError: Fernet key must be 32 URL-safe base64-encoded bytes." hatası alıyorum nasıl çözebilirim?
Öncelikle kod paylaşırken lütfen kodunuzda gereksiz karakterlerin olmamasına özen gösterin. Muhtemelen forumun imla düzeltme aracını kullanmışsınız, lütfen kodlarda bu aracı kullanmayın. Söylemek gerekirse aslında kodunuz çalışıyor ancak muhtemelen byte string nedir, normal string nedir bilmiyorsunuz ve bu yüzden hatalı yeri kopyalıyorsunuz. Şimdi 1 seçeneğini seçtiğimde kodunuzun çıktısını aşağı atayım, onun üzerinden ilerleyeyim.
Gördüğünüz üzere çıktı ve anahtarı hatasız verebiliyor. Yalnız burada ikisinin de başında b' ve sonunda da ' olduğuna dikkat etmeniz lazım. print() komutunun bu tarz bir çıktı vermesi şunu ifade ediyor: Fernet.generate_key() ve Fernet.decrypt() metotları bize string değil bytes (byte string de denebilir) döndürüyor. Python da bytestring belirtmek için b"" ibaresini kullanıyor. Örneğin "a" bir string iken b"a" aslında bir byte. Siz de muhtemelen bu b' ibaresini de kopyalıyorsunuz ancak o ibareyi kopyalamamanız gerekmekte. Bunun önüne geçmek için en doğru çözüm yolu print statement'ının içinde bu bytle'ları decode etmeniz. Tercihen ascii standardını kullanın çünkü Fernet modülü b64 encode kullanıyormuş. Bu da var olan byte'ların ascii olarak ifade edilmesi anlamına geliyor. Giriş mesajını utf-8 olarak encode etmişsiniz zaten, doşayısıyla çözülmüş mesajı da utf-8 olarak encode edebilirsiniz. Key ve şifreli mesaj ascii olsun.
Not: Ascii yerine utf-8 olarak da decode etmenizde bir sakınca çıkmaz muhtemelen. Kütüphaneyi kurcalayarak öğrenebilirsiniz.
Aşağıya tamamlanmış kodu atıyorum.
Python:
from cryptography.fernet import Fernet
def get_key():
key = input("Anahtar: ")
return key
def encrypt(message):
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(message)
print(f"Çıktı: {token.decode('ascii')} \nAnahtar: {key.decode('ascii')} \n")
def decrypt(message, key):
f = Fernet(key)
token = f.decrypt(message)
print(f"Mesaj: {token.decode('utf-8')}\n")
while True:
get = input("1 (Şifrele) mi 2 (Şifre Çöz) mü? > ")
if get == "1":
message = input("Mesaj: ")
message = bytes(message, "utf-8")
encrypt(message)
elif get == "2":
message = input("Mesaj: ")
key = get_key()
decrypt(message, key)
else:
print("Yanlış Seçim")
Öncelikle kod paylaşırken lütfen kodunuzda gereksiz karakterlerin olmamasına özen gösterin. Muhtemelen forumun imla düzeltme aracını kullanmışsınız, lütfen kodlarda bu aracı kullanmayın. Söylemek gerekirse aslında kodunuz çalışıyor ancak muhtemelen byte string nedir, normal string nedir bilmiyorsunuz ve bu yüzden hatalı yeri kopyalıyorsunuz. Şimdi 1 seçeneğini seçtiğimde kodunuzun çıktısını aşağı atayım, onun üzerinden ilerleyeyim.
Gördüğünüz üzere çıktı ve anahtarı hatasız verebiliyor. Yalnız burada ikisinin de başında b' ve sonunda da ' olduğuna dikkat etmeniz lazım. print() komutunun bu tarz bir çıktı vermesi şunu ifade ediyor: Fernet.generate_key() ve Fernet.decrypt() metotları bize string değil bytes (byte string de denebilir) döndürüyor. Python da bytestring belirtmek için b"" ibaresini kullanıyor. Örneğin "a" bir string iken b"a" aslında bir byte. Siz de muhtemelen bu b' ibaresini de kopyalıyorsunuz ancak o ibareyi kopyalamamanız gerekmekte. Bunun önüne geçmek için en doğru çözüm yolu print statement'ının içinde bu bytle'ları decode etmeniz. Tercihen ascii standardını kullanın çünkü Fernet modülü b64 encode kullanıyormuş. Bu da var olan byte'ların ascii olarak ifade edilmesi anlamına geliyor. Giriş mesajını utf-8 olarak encode etmişsiniz zaten, doşayısıyla çözülmüş mesajı da utf-8 olarak encode edebilirsiniz. Key ve şifreli mesaj ascii olsun.
Not: ASCII yerine utf-8 olarak da decode etmenizde bir sakınca çıkmaz muhtemelen. Kütüphaneyi kurcalayarak öğrenebilirsiniz.
Aşağıya tamamlanmış kodu atıyorum.
Python:
from cryptography.fernet import Fernet.
def get_key():
key = input("Anahtar: ")
return key.
def encrypt(message):
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(message)
print(f"Çıktı: {token.decode('ascii')} \nAnahtar: {key.decode('ascii')} \n")
def decrypt(message, key):
f = Fernet(key)
token = f.decrypt(message)
print(f"Mesaj: {token.decode('utf-8')}\n")
while True:
get = input("1 (Şifrele) mi 2 (Şifre Çöz) mü? > ")
if get == "1":
message = input("Mesaj: ")
message = bytes(message, "utf-8")
encrypt(message)
elif get == "2":
message = input("Mesaj: ")
key = get_key()
decrypt(message, key)
else:
print("Yanlış Seçim")
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: sa
Çıktı: gAAAAABkhL6A6L5iG6Iw1drSGLiNS8hE0w2X-D4XcBTeyxt8SnSRpeO91v4YXa6izMVAsNI57wYW50J4w8Vp9Y37EPZgszQwQA==
Anahtar: mAwHAgm-tYvL71IU6af7lvxCywaJCh6I1p45sW0jPbU=
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 2
Mesaj: gAAAAABkhL6A6L5iG6Iw1drSGLiNS8hE0w2X-D4XcBTeyxt8SnSRpeO91v4YXa6izMVAsNI57wYW50J4w8Vp9Y37EPZgszQwQA==
Anahtar: mAwHAgm-tYvL71IU6af7lvxCywaJCh6I1p45sW0jPbU=
Traceback (most recent call last):
File "main.py", line 142, in <module>
decrypt(message, key)
File "main.py", line 129, in decrypt
token = f.decrypt(message)
File "C:\Python38\lib\site-packages\cryptography\fernet.py", line 83, in decrypt
timestamp, data = Fernet._get_unverified_token_data(token)
File "C:\Python38\lib\site-packages\cryptography\fernet.py", line 108, in _get_unverified_token_data
utils._check_bytes("token", token)
File "C:\Python38\lib\site-packages\cryptography\utils.py", line 32, in _check_bytes
raise TypeError("{} must be bytes".format(name))
TypeError: token must be bytes
Öncelikle kod paylaşırken lütfen kodunuzda gereksiz karakterlerin olmamasına özen gösterin. Muhtemelen forumun imla düzeltme aracını kullanmışsınız, lütfen kodlarda bu aracı kullanmayın. Söylemek gerekirse aslında kodunuz çalışıyor ancak muhtemelen byte string nedir, normal string nedir bilmiyorsunuz ve bu yüzden hatalı yeri kopyalıyorsunuz. Şimdi 1 seçeneğini seçtiğimde kodunuzun çıktısını aşağı atayım, onun üzerinden ilerleyeyim.
Gördüğünüz üzere çıktı ve anahtarı hatasız verebiliyor. Yalnız burada ikisinin de başında b' ve sonunda da ' olduğuna dikkat etmeniz lazım. print() komutunun bu tarz bir çıktı vermesi şunu ifade ediyor: Fernet.generate_key() ve Fernet.decrypt() metotları bize string değil bytes (byte string de denebilir) döndürüyor. Python da bytestring belirtmek için b"" ibaresini kullanıyor. Örneğin "a" bir string iken b"a" aslında bir byte. Siz de muhtemelen bu b' ibaresini de kopyalıyorsunuz ancak o ibareyi kopyalamamanız gerekmekte. Bunun önüne geçmek için en doğru çözüm yolu print statement'ının içinde bu bytle'ları decode etmeniz. Tercihen ascii standardını kullanın çünkü Fernet modülü b64 encode kullanıyormuş. Bu da var olan byte'ların ascii olarak ifade edilmesi anlamına geliyor. Giriş mesajını utf-8 olarak encode etmişsiniz zaten, doşayısıyla çözülmüş mesajı da utf-8 olarak encode edebilirsiniz. Key ve şifreli mesaj ascii olsun.
Not: Ascii yerine utf-8 olarak da decode etmenizde bir sakınca çıkmaz muhtemelen. Kütüphaneyi kurcalayarak öğrenebilirsiniz.
Aşağıya tamamlanmış kodu atıyorum.
Python:
from cryptography.fernet import Fernet
def get_key():
key = input("Anahtar: ")
return key
def encrypt(message):
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(message)
print(f"Çıktı: {token.decode('ascii')} \nAnahtar: {key.decode('ascii')} \n")
def decrypt(message, key):
f = Fernet(key)
token = f.decrypt(message)
print(f"Mesaj: {token.decode('utf-8')}\n")
while True:
get = input("1 (Şifrele) mi 2 (Şifre Çöz) mü? > ")
if get == "1":
message = input("Mesaj: ")
message = bytes(message, "utf-8")
encrypt(message)
elif get == "2":
message = input("Mesaj: ")
key = get_key()
decrypt(message, key)
else:
print("Yanlış Seçim")
Çözdüm sorunu decrypt fonksiyonundaki tokeni şu şekilde yapmanız lazımmış
token = f.decrypt(bytes(message, "utf-8"))
fakat yardım ettiğiniz için sizi çözüm olarak işaretlemek istiyorum bu kod ile mesajınızı düzenler misiniz.