Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: if-valintarakennetta ei ajeta

krtsaa [14.05.2013 04:01:02]

#

Moi, olen juuri aloittanut ohjelmoinnin tänään ja saanut tapella tän ongelman kanssa koko yön. Elikkäs ongelmana on tämä, että olen rakentanut tälläisen pienen koodin joka salaa salasanat (Pastebin: http://pastebin.com/ZZdYFmDd) ohjelma ei anna mitään arvoa syötetyillä komennoilla. Huomasin kyllä jos otan if-komentojen kohalla print:eistä sisällytykset pois ohjelma toimii, mutta antaa kaikilla mahdollisilla salauksilla kyseisen salasanan. Veikkaampa, että olen mennyt tekemään jonkun alottelijan mokan tässä ohjelmassa.

Kiitos kovasti avusta.

import hashlib

MD5 = hashlib.md5()
# perässä muut algoritmit

print('Algoritmityypit: MD5, SHA1, SHA224, SHA256, SHA384, SHA512')
hashtype = input('Anna algoritmityyppi jota haluat käyttää: ')
passwd = input('Anna salasana jonka haluat salata: ')

if hashtype == MD5:
    MD5.update(passwd)
    print (MD5.hexdigest())

# perässä muut algoritmit

samip [14.05.2013 07:29:37]

#

if hashtype == 'MD5':

eli lainausmerkit puuttuvat.

tai sitten jotain tämän kaltaista

import hashlib

allowed = ['MD5','SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512']

hashtype = input('Anna algoritmityyppi jota haluat käyttää: ')
passwd = input('Anna salasana jonka haluat salata: ')
# tässä kohtaa tarkista että hashtype löytyy allowed taulukosta tai hashlib.algorithms:sta (sisältää kaikki kirjaston tukemat algoritmit)
h = hashlib.new(hashtype)
h.update(passwd)
print(h.hexdigest())

krtsaa [14.05.2013 13:55:12]

#

kiitos avusta. eikä aikaan kun ajauduin uudestaan ongelmiin ja tällä kertaa pitäisi saada muutettua nuo arvot unicodeksi ennekuin pystyn tulostaa arvon.

tällästä väittää nytten:

Traceback (most recent call last):
  File "/home/krtsaa/workspace/passwordToHash/passtohash.py", line 19, in <module>
    h.update(passwd)
TypeError: Unicode-objects must be encoded before hashing

löysin jo, että miten sen saisin muutettua:

passwd.encode('utf-8')

mutta en tiedä mihin lauseke kuuluisi sijoittaa. olen yrittänyt sijoittaa sitä moneen eri paikkaan, mutta ei tunnu sopivan siltikään.

kiitos vielä kerran avusta.

Lisäys:

ja tällä kertaa toteutus tällä tavalla:

allowed = ['MD5','SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512']

if hashtype == allowed:
    h = hashlib.new(hashtype)
    h.update(passwd)
    print(h.hexdigest())

ei valita unicodesta, mutta ei tulosta mitään. jatkaa vaan suoraa

time.sleep(5.5)

kohtaan

Metabolix [14.05.2013 14:32:24]

#

krtsaa kirjoitti:

löysin jo – – passwd.encode('utf-8') – – mutta en tiedä mihin lauseke kuuluisi sijoittaa.

Virheilmoituksessa näkyy rivi, jolla virhe on. Sinun pitää vaihtaa kyseiseltä riviltä passwd:n tilalle passwd.encode("UTF-8"). Funktiokutsu ei muuta alkuperäistä muuttujaa mitenkään vaan palauttaa aivan uuden arvon:

x = "abcåäö"
print(x) # Teksti.
print(x.encode("UTF-8")) # Enkoodattu arvo.
print(x) # Teksti, aivan kuten alussa.

Ja tässähän nimenomaan ei muuteta arvoa unicodeksi vaan päinvastoin unicode-teksti enkoodatuksi tavujonoksi.

krtsaa kirjoitti:

if hashtype == allowed:

Tarkistat, onko hashtype sama kuin allowed – ei tietenkään ole, koska hashtype on teksti ja allowed on lista. Sinun pitäisi tarkistaa in-operaattorilla, onko hashtype allowed-listan jäsen. Jos ei ole erityistä syytä rajata algoritmeja vain tiettyihin, voisit kyllä käyttää suoraan listaa hashlib.algorithms_available.

Sinun kannattaisi selvästi lukea Python-opas.

krtsaa [14.05.2013 15:04:31]

#

kiitos vastauksesta. luenpan uudestaa python oppaan ja kirjan mikä minulla on. sain nytten ohjelman toimimaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta