Çözüldü "ValueError: Fernet key must be 32 URL-safe base64-encoded bytes." hatası

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

565148

Decapat
Katılım
19 Temmuz 2022
Mesajlar
643
Çözümler
8
Arkadaşlar kodum şu şekilde.

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} \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?
 
Çözüm
fakat yardım ettiğiniz için sizi çözüm olarak işaretlemek istiyorum bu kod ile mesajınızı düzenler misiniz.
Ne yazık ki artık düzenleyemiyorum. Yine de teşekkür ederim. Aşağıya düzeltilmiş kodu atayım.

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(bytes(message, "utf-8"))
    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")
[/SPOILER]
Ö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.

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu
Çıktı: b'gAAAAABkgvWT7JaKjIdEsu_OwM4DUgqgxEvYWPktKnbRqVmvq6vJ8rZ8Nab8wOLC26AD9xVkM_HO8pgBO_F5XWQaFbjGXWIeNw=='
Anahtar: b'1QkwTYZWe3mukchSWm9bpWET_V6lSk4uWN7a_HHcs5c='

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")

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu
Çıktı: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=

1 (Şifrele) mi 2 (Şifre Çöz) mü? > 2
Mesaj: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=
Mesaj: uwu
 
Ö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.

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu.
Çıktı: b'gAAAAABkgvWT7JaKjIdEsu_OwM4DUgqgxEvYWPktKnbRqVmvq6vJ8rZ8Nab8wOLC26AD9xVkM_HO8pgBO_F5XWQaFbjGXWIeNw=='
Anahtar: b'1QkwTYZWe3mukchSWm9bpWET_V6lSk4uWN7a_HHcs5c='

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")

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu.
Çıktı: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=

1 (Şifrele) mi 2 (Şifre Çöz) mü? > 2
Mesaj: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=
Mesaj: uwu.

Böyle bir hata çıkıyor şimdi de.

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

verdiğiniz kodu kullandım.

Ö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.

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu
Çıktı: b'gAAAAABkgvWT7JaKjIdEsu_OwM4DUgqgxEvYWPktKnbRqVmvq6vJ8rZ8Nab8wOLC26AD9xVkM_HO8pgBO_F5XWQaFbjGXWIeNw=='
Anahtar: b'1QkwTYZWe3mukchSWm9bpWET_V6lSk4uWN7a_HHcs5c='

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")

Kod:
1 (Şifrele) mi 2 (Şifre Çöz) mü? > 1
Mesaj: uwu
Çıktı: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=

1 (Şifrele) mi 2 (Şifre Çöz) mü? > 2
Mesaj: gAAAAABkgvkcFqEIe25TeTMYGjVQocULGDA-k65D6_oKUd5_DIz1oIuQGgeYh0yF6t41janNusi0kPymf0vFv-sMxel6hv5hkA==
Anahtar: -5Wg7A5dUzqGxwtWJWUQICc3pdkEhUcAjr9UaNpnWhA=
Mesaj: uwu
Çö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.
 
Son düzenleme:
fakat yardım ettiğiniz için sizi çözüm olarak işaretlemek istiyorum bu kod ile mesajınızı düzenler misiniz.
Ne yazık ki artık düzenleyemiyorum. Yine de teşekkür ederim. Aşağıya düzeltilmiş kodu atayım.

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(bytes(message, "utf-8"))
    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")
[/SPOILER]
 
Çözüm

Technopat Haberler

Yeni konular

Geri
Yukarı