şifreli kilitte şifre degiştirme

Başlatan adoka, 10 Mart 2011, 21:11:55

adoka

Herkese merhaba..Pic Basic proyu kendi çapımda ogrenmeye ve kendimi gelistirmeye calısıyorum bu manada bir şifreli kilt programı yazmaya karar verdim yaklasık bir aydır da bunun uzerinde calısıyorum yazdıgım program genel hatlarıyla calısıyor.Her şifreli kilt programında olması gerektigi gibi bende programıma şifre degistirme alt programı eklemek istiyorum fakat bunu yapmayı bir turlu basaramadım uyguladıgım devrede rakam tusları haric 4 adet fonksiyon tusu var bunlardan birini şifre degistirme fonksiyonu icin ayırmayı dusunuyorum bu tusa basıldıgında program şifre degistirme alt programında dallancak ve burada şifre degistirme işlemi gerceklestirilecek işte tam bu noktada takılıyorum.Konu ile alakalı ustadlardan yardım talep ediyorum.Kalın saglıcakla....
Bir mum diğer bir mumu tutuşturmakla, ışığından bir şey kaybetmez. (Mevlana)

Tagli

Takıldığın yer neresi? Birşeyler yazdın da çalıştıramadın mı yoksa nasıl bir yol izlemen gerektiğini belirleyemediğin için yazmaya mı başlayamadın? Şifre değiştirme kısmı haricinde olan bölüm çalışıyor mu? Kodu eklersen yardım alman kolaylaşacaktır.

Eğer güvenlik kaygıları sebebiyle kodu burada paylaşman mümkün değil ise, en azından şu sorulara cevap vermen gerekiyor: Şifreyi hafızanın neresinde saklıyorsun? Program hafızasına mı gömülü yoksa EEPROM'da mı? Ve de kullandığın PIC'in modeli nedir?
Gökçe Tağlıoğlu

ete

Genellikle bu iş için bir şifre değiştirme ekranı tasarlanır. BU ekranda;
Önce mevcut şifre girilmesi istenir. Ardından girilen şifre kayıtlı şifreleriçinde varmıdır ona bakılır.
Kayıtlı değil ise şifre kayıtlı değil ikazı verilir ve yenisi girilmesi istenir.
Şayet kayıtlı ise bu seferde yeni şifrenin girilmesiistenir bir alt satırda yapılan bu işlemden sonra değişiklik ihtiyacı yok ise bir onay tuşuna bastırılarak eski şifre yerine yenisi kayıt edilerek bu işemden çıkılır. Hepsi bu kadar. Zor bir işlem değil.
Programın bir yerinde mutlaka şifre girdiriyorsundur. Benzer mantıkla bir şifre girdir ve doğruluğunu kontrol et ardından bir alt satırda yenisini girdir ve eskisinin üzerine kayıt et. Çok zor değil.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

adoka

Tagli hocam programım mevcut sifreyi degistirme bolumu haricinde calısıyor tabi daha son halini almadı.Su an takıldıgım nokta mevcut sifreyi degistirme konusunda.yazdıgım program asagıdadır...
Ete hocam oncelikle hazırladıgınız pic basic dersleri icin tesekkur etmek isterim ogrenme konusunda bana cok sey kattılar.

TRISA=%11111111
TRISB=%00001000
TRISC=%11110000
TRISD=%00000000
TRISE=0


Define LCD_DREG PORTD   
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 5
Define LCD_EREG PORTB
Define LCD_EBIT 7
Define LCD_BITS 8
Define LCD_LINES 2
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBITS 6

'ON INTERRUPT GOTO SIF_DEG
'INTCON=%10100000
'OPTION_REG=%00110001
DONGU VAR BYTE
RAKAM VAR BYTE
ZAMAN VAR BYTE
TUS VAR BYTE
A VAR BYTE
B VAR BYTE
C VAR BYTE
D VAR BYTE
A1 VAR BYTE
A2 VAR BYTE
A3 VAR BYTE
A4 VAR BYTE
B1 CON 5
B2 CON 5
B3 CON 4
B4 CON 1

SYMBOL C0=PORTC.0
SYMBOL C1=PORTC.1
SYMBOL C2=PORTC.2
SYMBOL C3=PORTC.3
SYMBOL C4=PORTC.4
SYMBOL C5=PORTC.5
SYMBOL C6=PORTC.6
SYMBOL C7=PORTC.7
SYMBOL ROLE=PORTB.7

ANAEKRAN:
TUS=0
ZAMAN=0
rakam=0
ROLE=0
A=0
D=PORTD
PAUSE 50
LCDOUT $FE,1
PAUSE 50
LCDOUT "   SIFRE GIRINIZ"
GOSUB BASLA

BASLA:
FOR DONGU=8 TO 11
HIGH DONGU
GOSUB DEGER
LOW DONGU
NEXT DONGU
GOTO BASLA
END

DEGER:
IF C0=1 AND C4=1 THEN
TUS=1
GOSUB EKRAN
ENDIF
IF C0=1 AND C5=1 THEN
TUS=2
GOSUB EKRAN
ENDIF
  IF C0=1 AND C6=1 THEN
  TUS=3
  GOSUB EKRAN
  ENDIF
   IF C1=1 AND C4=1 THEN
   TUS=4
   GOSUB EKRAN
   ENDIF
    IF C1=1 AND C5=1 THEN
    TUS=5   
    GOSUB EKRAN
    ENDIF
     IF C1=1 AND C6=1 THEN
     TUS=6
     GOSUB EKRAN
     ENDIF
      IF C2=1 AND C4=1 THEN
      TUS=7     
      GOSUB EKRAN
      ENDIF
       IF C2=1 AND C5=1 THEN
       TUS=8
       GOSUB EKRAN
       ENDIF
        IF C2=1 AND C6=1 THEN
        TUS=9
        GOSUB EKRAN
        ENDIF
         IF C3=1 AND C4=1 THEN
         lcdout $FE,1
         pause 40
         LCDOUT "*"
         ENDIF
          IF C3=1 AND C5=1 THEN
          TUS=0
          GOSUB EKRAN
          ENDIF
           IF C3=1 AND C6=1 THEN
           LCDOUT $FE,1
           PAUSE 40
           LCDOUT "#"
           ENDIF
            IF C0=1 AND C7=1 THEN
            TUS=11       
            GOSUB SIF_DEG
            ENDIF
             IF C1=1 AND C7=1 THEN
             TUS=12
             GOSUB EKRAN
             ENDIF
              IF C2=1 AND C7=1 THEN
              TUS=13
              GOSUB EKRAN
              ENDIF
                IF C3=1 AND C7=1 THEN
                TUS=14
                GOSUB EKRAN
                ENDIF
          RETURN

   
EKRAN:
IF RAKAM=0 THEN
IF TUS=B1 THEN
  A=A+1
   ENDIF
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,$C0,"   SIFRE:",042
ENDIF

IF RAKAM=1 THEN
IF TUS=B2 THEN
  A=A+1
   ENDIF
PAUSE 50
LCDOUT $FE,$C0,"   SIFRE:",042,042
ENDIF

IF RAKAM=2 THEN
IF TUS=B3 THEN
  A=A+1
   ENDIF
PAUSE 50
LCDOUT $FE,$C0,"   SIFRE:",042,042,042
ENDIF

IF RAKAM=3 THEN
IF TUS=B4 THEN
  A=A+1
   ENDIF
PAUSE 50
LCDOUT $FE,$C0,"   SIFRE:",042,042,042,042
ENDIF
RAKAM=RAKAM+1
PAUSE 100
IF RAKAM=4 THEN
A=0
GOSUB DOGRULA
ELSE
GOTO BASLA
ENDIF

DOGRULA:
IF A=4 THEN
LCDOUT $FE,1
PAUSE 40
LCDOUT "       SIFRE"
LCDOUT $FE,$C0,"    KABULEDILDI"
HIGH ROLE
PAUSE 250
LOW ROLE
GOTO ANAEKRAN
ELSE
GOSUB RED
ENDIF

RED:
LCDOUT $FE,1
PAUSE 40
LCDOUT "   YANLIS SIFRE "
PAUSE 100
GOTO ANAEKRAN

SIF_DEG:
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,1,"SIFRE DEGISTIRME"
LCDOUT $FE,$C0,"ESKI SIFRE:"
PAUSE 200
IF B=0 AND TUS=B1 THEN
  A=A+1
LCDOUT $FE,"SIFRE DEGISTIRME"
LCDOUT $FE,$C0,"ESKI SIFRE:","A"
ENDIF
IF B=1 AND TUS=B2 THEN
  A=A+1
LCDOUT $FE,"SIFRE DEGISTIRME"
LCDOUT $FE,$C0,"ESKI SIFRE:","B"
ENDIF

IF B=2 AND TUS=B3 THEN
  A=A+1
LCDOUT $FE,"SIFRE DEGISTIRME"
LCDOUT $FE,$C0,"ESKI SIFRE:","C"
ENDIF

IF B=3 AND TUS=B4 THEN
  A=A+1
LCDOUT $FE,"SIFRE DEGISTIRME"
LCDOUT $FE,$C0,"ESKI SIFRE:","D"
ENDIF
RETURN
B=B+1
IF B=4 THEN
LCDOUT $FE,1
PAUSE 40
LCDOUT "YENI SIFRE:"
IF A1=1 THEN
TUS=B1
ENDIF
ENDIF

Ete hocam an alttaki sıf_deg etiketini yok sayın zira calısmıyor ve degistirilmesi yahut farklı bir metod ile yazılması gerekli.Bu noktada benimde yapmak istedigim sizin ifadenize benzer sekilde,diyelimki şifreli kilidimizi kullanıyoruz bir sebepten dolayı mevcut sifreyi degistirme geregi duydum fonksiyon tuslarından sifre degistirmek icin atadıgım tusa bastım ve sifre degistirme ekranı geldi ve ekranda eski sifreyi girin seklinde bir uyarı belirecek eski sifre girildikten sonra da bizden yeni sifre isteyecek yeni sifremizi tus takımı vasıtasıyla girecek ve en son kayıt tusuna basarak kayıt edecegiz ve eski sifremizi yenisi ile degistirmiz olacagız.Sifreyi su anda degiskenlere sabit atayarak yapıyorum fakat son halinde tus takımından girilen verileri eeproma kayıt ederek yapmak istiyorum ki sifreyi degistirmek istedigimizde istedigimiz rakamı girerek degistirebilelim.İste bu anlattıgım noktada sıfre degistirme alt programını nasıl bir mantıkla yazabilirim yardımlarınızı esirgemez iseniz cok sevinirim...Herkese saygılar...
Bir mum diğer bir mumu tutuşturmakla, ışığından bir şey kaybetmez. (Mevlana)

ete

Gerçekten sorununu tam olarak anlamış değilim. Anlattıklarımı anladığını düşünüyorum. Ancak bunu nasıl olurda programa yansıtamadığını pek anlamadım doğrusu. Ama sana yinede bazı açıklamalar vereceğim bunlardan bir şeyler algılayıp sorununu çözeceğinden eminim.

Önce varsayımlarımızı sıralayalım;
1. Bir tuş takımımız var ve buradan girdiğimiz rakam tuşlarını program algılıyor. Tuş takımından geşen basılmış tuşa TUS diyelim.
2. Şifre hane sayısını belirtmemişsin ben 8 hane (digit) varsayacağım. Bunun için iki değişken kullanacağız. SIFA ilk 4 digit'i tutacak SIFB ise geri kalan 4 digiti tutacak. Bu değişkenler WORD tipinde olacak. 4 digit en büyük sayı 9999 olduğundan sınırlar içinde kalacak sayılar.
3. Eski Sifre: yazısı karşısına kursorü getirip tuş takımından girilen sayıları önce SIFA ya daha sonrada SIFB ye aktarmak için aşağıdaki yöntemi kullanacağız. Önce hane sayısını sayacak bir HANE değişkeni (Byte) kullanalım. Başlangıçta HANE=0 olacak.
Bu arada girilenleri doğru yerde yazdırmak için ;
LCDOUT $fe,$c0,"Eski Sifre: ",dec4 SIFA,dec4 SIFB şeklinde bir satır kullan ve aşağıdaki hesaplamaların ardından bu satırları her defasında çağır.

4. Diyelimki ilk girilen tus=5 oldu. SIFA=SIFA*10+TUS şeklind ebir formül uygulayacağız. ilk hesaplamada SIFA=0*10+5=5 olacaktır. Hane=1
5. İkinci girilen tus değeri 3 olsun (53 girilmiş oldu) TUS=5*10+3=53 bulunur. Hane=2
6. Üçüncü girilen değer 1 olsun SIFA=53*10+1=531 bulundu ve ekrana yazıldı .Hane=3
Şayet hane sayısı 3 den büyük ise bu sefer formül SIFB=SIFB*10+TUS şeklinde uygulanacaktır.
İşte bu mantıkla SIFA ve SIFB tamamlandıktan sonra (sifre tam olarak girildikten sonra) yeni şifrede aynı mantıkla gerekirse banzer şekilde başka değişkenlere alınır.

Sonra eproma yazarken;
WRITE 10, SIFA.byte0,SIFA.byte1,SIFB.Byte0,SIFB.Byte1 şeklinde yazdırılır. Gerekirse aynı adresten daha sonra kolaylıkla okunur.

Bu kadar bilgiden sonra birşeyler yaparsın umarım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

adoka

Tesekkurler hocam verdiginiz bilgiler dahilinde hemen uygulamaya koyulucam aslında yazdıklarınıza benzer komutları dusundum fakat kafam cok karısmıstı malum henuz emekleme safhasındayız komut bilgim ve pratigim yeni yeni gelisiyor gelismeleri burada paylasırım.Kalın saglıcakla....
Bir mum diğer bir mumu tutuşturmakla, ışığından bir şey kaybetmez. (Mevlana)

adoka

nihayet programı bitirebildim ete hocama da buradan tekrar tesekkur ediyorum bu benim ilk programım eksik ve kusurlar olabilir aslında daha bir kac ekleme daha yapmak istiyorum simdilik bu kadarını paylasmak istedim devremiz 4 haneli sifreli kilit ekranda cesitli uyarılar veriyor ve ledlerle gorsel ikaz yapıyor isteyen portc.7 ye buzzer ekleyebilir sifre degistirilebilir simdilik bu kadar kalın saglıcakla...
devre seması asagıda...

http://www.upload.gen.tr/resim.php/www/kvkkb3qv/sifrelikilit.JPG.html

bu da pic basic pro da yazılmıs programımız

TRISA=%11111111
TRISB=%00001111
TRISC=%01110000
TRISD=0
TRISE=0

Define LCD_DREG PORTD   
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 5
Define LCD_EREG PORTB
Define LCD_EBIT 7
Define LCD_BITS 4
Define LCD_LINES 4
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBITS 6

CEVRIM VAR BYTE
BUTON VAR BYTE
DONGU VAR BYTE
RAKAM VAR BYTE
HANE VAR BYTE
TUS VAR BYTE
OKU VAR BYTE
SAY VAR BYTE
OKU1 VAR BYTE
SIFRE1 VAR BYTE
SIFRE2 VAR BYTE
H_SIFRE VAR BYTE
A1 VAR BYTE
A2 VAR BYTE
A3 VAR BYTE
A4 VAR BYTE
A VAR BYTE
B VAR BYTE
C VAR BYTE
D VAR BYTE
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE
SYMBOL C0=PORTC.0
SYMBOL C1=PORTC.1
SYMBOL C2=PORTC.2
SYMBOL C3=PORTC.3
SYMBOL C4=PORTC.4
SYMBOL C5=PORTC.5
SYMBOL C6=PORTC.6
SYMBOL ROLE=PORTB.4
SYMBOL TA=PORTB.0
SYMBOL TB=PORTB.1
SYMBOL TC=PORTB.2
SYMBOL TD=PORTB.3
SYMBOL LED=PORTD.0
SYMBOL BUZZER=PORTC.7
H_SIFRE=0
SIFRE1=0
SIFRE2=0
ANAEKRAN:
CEVRIM=0
BUTON=0
DONGU=0
RAKAM=0
TUS=0
HANE=0
OKU=0
OKU1=0
LED=0
SAY=0
A1=0
A2=0
A3=0
A4=0
A=0
B=0
C=0
D=0
TA=0
TB=0
TC=0
TD=0
BUZZER=0

PAUSE 100
LCDOUT $FE,1
PAUSE 60
LCDOUT "SIFRE GIRIS ICIN 'A'"
LCDOUT $FE,$C0,"SIFRE DEGISTIRME 'B'"
LCDOUT $FE,$94,"EKRANI SIL       'C'"
GOSUB GIRIS

GIRIS:
IF TA=1 THEN
LCDOUT $FE,1
PAUSE 60
LCDOUT $FE,$0F
LCDOUT $FE,$96,"SIFRE:"
GOSUB BASLA
ENDIF
IF TB=1 THEN
B=B+1
LCDOUT $FE,1
PAUSE 60
LCDOUT $FE,$C0,"ESKI SIFREYI GIRIN"
GOSUB BASLA
ENDIF
GOTO GIRIS

BASLA:
FOR DONGU=8 TO 11
HIGH DONGU
GOSUB TUSOKU
LOW DONGU
NEXT DONGU
GOTO BASLA
END

TUSOKU:
IF C0=1 AND C4=1 THEN
TUS=1
GOSUB EKRAN
ENDIF
IF C0=1 AND C5=1 THEN
TUS=2
GOSUB EKRAN
ENDIF
  IF C0=1 AND C6=1 THEN
  PAUSE 5
  TUS=3
  GOSUB EKRAN
  ENDIF
   IF C1=1 AND C4=1 THEN
   TUS=4
   GOSUB EKRAN
   ENDIF
    IF C1=1 AND C5=1 THEN
    TUS=5
    GOSUB EKRAN
    ENDIF
     IF C1=1 AND C6=1 THEN
     TUS=6
     GOSUB EKRAN
     ENDIF
      IF C2=1 AND C4=1 THEN
      TUS=7
      GOSUB EKRAN
      ENDIF
       IF C2=1 AND C5=1 THEN
       TUS=8
       GOSUB EKRAN
       ENDIF
        IF C2=1 AND C6=1 THEN
        TUS=9
        GOSUB EKRAN
        ENDIF
         IF C3=1 AND C4=1 THEN
         lcdout $FE,1
         pause 40
         LCDOUT "*"
         ENDIF
          IF C3=1 AND C5=1 THEN
          TUS=0
          GOSUB EKRAN
          ENDIF
           IF C3=1 AND C6=1 THEN
           LCDOUT $FE,1
           PAUSE 40
           LCDOUT "#"
           ENDIF
            IF TC=1 THEN
            GOTO ANAEKRAN
            ENDIF
          RETURN
         
EKRAN:
IF RAKAM=0 THEN
OKU=0*10+TUS
A1=OKU
LCDOUT $FE,$0F
LCDOUT $FE,$9C,042
PAUSE 30
A=A+1
ENDIF

IF RAKAM=1 THEN
OKU=A1*10+TUS
LCDOUT $FE,$9D,042
PAUSE 30
A=A+1
ENDIF

IF RAKAM=2 THEN
OKU1=0*10+TUS
A2=OKU1
LCDOUT $FE,$9E,042
PAUSE 30
A=A+1
ENDIF

IF RAKAM=3 THEN
OKU1=A2*10+TUS
LCDOUT $FE,$9F,042
PAUSE 30
A=A+1
ENDIF
PAUSE 200
RAKAM = RAKAM+1
IF rakam=4 and A=4 THEN
GOSUB DOGRULA
ELSE
GOTO BASLA
ENDIF

DOGRULA:
READ 10,C
PAUSE 10
READ 14,D
IF B=1 THEN
   IF OKU=C AND OKU1=D THEN
LCDOUT $FE,1
PAUSE 100
LCDOUT "      ESKI SIFRE"
LCDOUT $FE,$C0,"     KABULEDILDI"
PAUSE 200
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,$C0,"YENI SIFRE:"
GOSUB BASLA2
ENDIF
ENDIF
IF OKU=C AND OKU1=D THEN
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,$C0,"SIFRE KABULEDILDI"
PAUSE 200
HIGH ROLE
PAUSE 500
LOW ROLE
GOTO ANAEKRAN
ELSE
GOSUB HATA
ENDIF


HATA:
IF H_SIFRE=2 THEN
HIGH BUZZER
ENDIF
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,$C0,"HATALI SIFRE"
H_SIFRE=H_SIFRE+1
HIGH LED
PAUSE 250
LOW LED
GOTO ANAEKRAN


BASLA2:
FOR CEVRIM=8 TO 11
  HIGH CEVRIM
  GOSUB DEGER2
  LOW CEVRIM
NEXT CEVRIM
GOTO BASLA2
END

DEGER2:
IF C0=1 AND C4=1 THEN
BUTON=1
GOSUB SIFREKAYIT
ENDIF
IF C0=1 AND C5=1 THEN
BUTON=2
  GOSUB SIFREKAYIT
ENDIF
  IF C0=1 AND C6=1 THEN
  BUTON=3
  GOSUB SIFREKAYIT
  ENDIF
   IF C1=1 AND C4=1 THEN
   BUTON=4
   GOSUB SIFREKAYIT
   ENDIF
    IF C1=1 AND C5=1 THEN
    BUTON=5   
    GOSUB SIFREKAYIT
    ENDIF
     IF C1=1 AND C6=1 THEN
     BUTON=6
     GOSUB SIFREKAYIT
     ENDIF
      IF C2=1 AND C4=1 THEN
      BUTON=7     
      GOSUB SIFREKAYIT
      ENDIF
       IF C2=1 AND C5=1 THEN
       BUTON=8
       GOSUB SIFREKAYIT
       ENDIF
        IF C2=1 AND C6=1 THEN
        BUTON=9
        GOSUB SIFREKAYIT
        ENDIF
          IF C3=1 AND C5=1 THEN
          BUTON=0
          GOSUB SIFREKAYIT
          ENDIF
            IF TC=1 THEN
            GOTO ANAEKRAN
            ENDIF
           RETURN   
         

SIFREKAYIT:
IF HANE=0 THEN
PAUSE 30
LCDOUT $FE,$CB,042
SIFRE1=(0*10)+BUTON
A3=SIFRE1 
ENDIF
IF HANE=1 THEN
PAUSE 30
LCDOUT $FE,$CC,042   
SIFRE1=(A3*10)+BUTON
ENDIF
IF HANE=2 THEN
PAUSE 30
LCDOUT $FE,$CD,042
SIFRE2=(0*10)+BUTON
A4=SIFRE2
ENDIF
IF HANE=3 THEN
PAUSE 30
LCDOUT $FE,$CE,042
SIFRE2=(A4*10)+BUTON   
ENDIF
PAUSE 200
HANE=HANE+1
IF HANE=4 THEN
LCDOUT $FE,1
PAUSE 100
LCDOUT "YENI SIFRE KAYDI"
LCDOUT $FE,$C0,"ICIN 'D' YE BASINIZ"
GOSUB KAYIT
else
goto BASLA2
ENDIF

KAYIT:
IF SAY=255 THEN
GOTO ANAEKRAN
  SAY=SAY+1
  ENDIF
IF TD=1 THEN
WRITE 10,SIFRE1
PAUSE 10
WRITE 14,SIFRE2
LCDOUT $FE,1
PAUSE 50
LCDOUT $FE,$C0,"YENI SIFRE KAYIT"
LCDOUT $FE,$94,"     EDILDI"
PAUSE 250
GOTO ANAEKRAN
ELSE
GOTO KAYIT
  ENDIF
   
Bir mum diğer bir mumu tutuşturmakla, ışığından bir şey kaybetmez. (Mevlana)