Verschlüsselung

Neue Frage »

Matts Auf diesen Beitrag antworten »
Verschlüsselung
Mein Schließfach bei der Bank hat einen vierstelligen Zugangscode. Um unberechtigten Personen, die zufälligerweise meine Kombination entdeckt haben könnten, den Zugang zu erschweren, wechsle ich täglich die vier Ziffern nach einer bestimmter Regel:

1. Aus den Ziffern der vierstelligen Zahl bilde ich die Quersumme.
2. Von der gebildeten Quersumme nehme ich die Einerstelle.
3. Diese Einerstelle füge ich rechts an meine vierstellige Zahl an und streiche die linke Ziffer, so dass wieder eine vierstellige Zahl entsteht.

Heute ist der 14.7.2005
Ich nehme die 2005 als Ausgangszahl.
Die Quersumme ist 7, die 7 anfügen, die 2 streichen. Als morgiger Code ergibt sich 0057.
Übermorgen ist mein Zugangscode 0572, denn die Quersumme ist 12, die 2 anfügen, die (erste) 0 streichen usw.

Frage: An welchem Datum entspricht der Zugangscode als nächstes wieder dem (dann) aktuellen Jahr, so wie es heute am 14.7.2005 der Fall ist?

Ausprobieren bis zum St. Nimmerleinstag ist hier doch nicht der Sinne der Sache, oder?
mercany Auf diesen Beitrag antworten »

Soll das ein Rätsel sein oder eine Hausaufgabe verwirrt
AD Auf diesen Beitrag antworten »

Zitat:
Original von Matts
Ausprobieren bis zum St. Nimmerleinstag ist hier doch nicht der Sinne der Sache, oder?

Warum nicht? Natürlich mit rechentechnischer Unterstützung - ist ungefähr ein Zehnzeiler (ausgenommen die Datumsrechnung) ...
Matts Auf diesen Beitrag antworten »

Es ist eine Rätselaufgabe mercany.

Arthur Dent, dann sag mir mal, wie ich das machen soll, ich habe außer Ausprobieren keinen Schimmer.
Xytras Auf diesen Beitrag antworten »

@Arthur: in 10 Zeilen schaff ich s nich ganz aber in 14 Zeilen Matlab-code (incl. Ausgabe):
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
t = 732507.00;
date = datevec(t);
xold = [2 0 0 5]
xnew = xold
yr = 0;
while (1000*xnew(1)+100*xnew(2)+10*xnew(3)+xnew(4) ~= yr)
	xold = xnew;
	xnew = [xold(2:4), mod(sum(xold), 10)];
	t = t+1;
	date = datevec(t);
	yr = date(1);
end;
xnew
datestr(t)


Sowas is allerdings unschoen weil wer vertraut schon gern computern - muss nacher oder so ma meine Mitschriften von der diskrete Mathe Vorlesung rausgraben - irgendwas gabs da doch mit iterierten abbildungen und so...
JochenX Auf diesen Beitrag antworten »

javaprogramm?
ich probier mal etwas pseudocode sicher megaschlecht, aber nur zum spaß:



int a = 2005;
int b = a;
int quersumme = 0;
int zaehler;

//die folgenden zeile rechnet die quersumme aus, da integer einfach den //kommarest weglassen

do {quersumme = a/1000; a=a-quersumme; quersumme=quersumme+a/100; ......}

//kA, wie das jetzt eleganter geht, die letzte ziffer zu finden

while (quersumme>1000) quersumme=quersumme-1000;
while (quersumme>100) quersumme=quersumme-100;
while (quersumme>10) quersumme=quersumme-10;

a=10*b+quersumme;
while (a>10000) a=a-10000;
zaehler ++;

repeat until a=2005;



edit: ich merke gerade ich hab das missverstanden
ich dachte, wann der code wieder dem heutigen entspricht, also wieder 2005 ist
naja egal, dann am ende eben eine datumsvergleichsabfrage dran

ach ist eh schmus, hat aber spaß gemacht Hammer
 
 
Xytras Auf diesen Beitrag antworten »

Eeeh - hatte ich vergessen: ergebnis smile
13-Jan-2017

naja , der Weg ist das Ziel smile
riwe Auf diesen Beitrag antworten »

ist auch nicht viel länger, aber das ergebnis ist bei mir der 29.11.2009, oder eigentlich der 28.11.2009?
werner
JochenX Auf diesen Beitrag antworten »

hallo werner, gleicher denkfehler wie ich

Zitat:
An welchem Datum entspricht der Zugangscode als nächstes wieder dem (dann) aktuellen Jahr, so wie es heute am 14.7.2005 der Fall ist?

2009 bräuchtest du also 2009 als code und nicht 2005
riwe Auf diesen Beitrag antworten »

@hallo jochen,
da habe ich ein bier gebraucht, damit ich das verstehe.
xytras hat recht, das ist dann der 13.1.2017

werner

excel-vba-code:

dat = Range("B2").Value
y = Year(dat)
n = CStr(y)
Do
s = 0
For i = 1 To 4
s = s + CInt(Mid$(n, i, 1))
Next
n = Mid$(n, 2)
n = n & Mid$(CStr(s), Len(CStr(s)), 1)
dat = dat + 1
y = Year(dat)
v = CStr(y)
Loop Until v = n
Range("G7").Value = dat
Xytras Auf diesen Beitrag antworten »

Zitat:
da habe ich ein bier gebraucht, damit ich das verstehe.

Hah - wer naturbrreit is is klar im Vorteil Augenzwinkern
kurellajunior Auf diesen Beitrag antworten »

Zitat:
Original von LOED
javaprogramm?
ich probier mal etwas pseudocode sicher megaschlecht, aber nur zum spaß:
Nur so zum Spaß: Mal richtig Java:

Als erstes eine Klasse Datum mit
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public class Datum{
  /** Constructor */
  public Datum(Date pStartDate);
 /** erhöht den Tag um eins */
  public Datum incDay();
  /** gibt das aktuelle Jahr zurück */
  public int getYear();
  /** gibt das aktuelle Datum aus*/
  public String toString();
}
Damit hätten wir die Funktionalität für Datum erhöhen und Jahr extrahieren hier rein verbannt.
Dann natürlich die Key-klasse:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class Key{
  /** Constructor wit starting key */
  public Key(int pStartKey);
  /** moves key one step left and adds Quersumme of old key to the
   * right */
  public Key shift Key();
  /** evaluates the Quersumme of the current Key and returns the last
   * digit*/
  private short calcQuer();
  /** test whether the given integer fits the current key*/
  public boolean isCorrectKey(int pTestKey);
}

In der Klasse Rechner bräuchten wir dann:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public class Rechner{
  public static int main(int argString[] args){
    lRechner = new Rechner();
    lRechner.berechneTag(new Date(args[1]));
  }
  public berechneTag(Date pStartDate){
    lDatum = new Datum(pStartDate);
    lKey = new Key(pStartDate.getYear());
    // start search
    lDatum.incDay();
    lKey.shift Key();
    while (!lKey.isCorrectKey(lDatum.getYear())
           AND lDatum.getYear 10000//Thanks to Arthur
    {
      lDatum.incDay();
      lKey.shift Key();
    }
    System.out.println(lDatum);
  }
}


Wie gesagt sauberes Java. natürlich hätte manauch alles in die main stopfen können, aber die Lösung hätte sich von den anderen nur im Syntax unterschieden. Das oben wäre eine saubere, objektorientierte Lösung...

Jan

PS: php steht da nur drüber, damit der Code farbig wird Augenzwinkern
AD Auf diesen Beitrag antworten »

Von wegen sauber - was ist, wenn es diese Jahreszahl gar nicht gibt? Ok, bei 2005 klappt es - aber kannst du so ohne weiteres sagen, dass bei anderen Jahreszahlen (bzw. genauer gesagt Anfangsdatum) dein Programm auch terminiert?


EDIT: Schreibfehler korrigiert.
kurellajunior Auf diesen Beitrag antworten »

Stänkerer, dann solltest Du auch noch anfügen, dass keine NotNull abfragen drin sind. Außerdem war gar nicht die Frage nach terminierung, sondern wann das nächste mal... Soll sich der Rechner doch totrechnen... *Bääh* Augenzwinkern

Allerdings könnte man eine selbstprüfende Logik einbauen, die die Kette von Schlüsseln auf eine Schleife untersucht (die muss es geben) und wenn die Jahreszahl den Bereich der möglichen Schlüsdel verlässt (also spätestens im Jahre 10000) dann sollte es abbrechen. Hmm, dei 10000 kann ich auf jeden Fall einbauen Augenzwinkern siehe Änderung...

Jan
Xytras Auf diesen Beitrag antworten »

Das Datums-Zeug kannste Dir (wenn Du schon am Optimieren bist) auch sparen, und direkt die java.util.Calendar-Klasse verwenden; vgl. Java API

smile

EDIT: Trotzdem bleibt noch die Frage offen wie man das mit Mitteln der diskreten Mathematik auch ohne Rechner loesen haett koennen - da muss es doch einen Weg geben... verwirrt
AD Auf diesen Beitrag antworten »

Du kannst ja damit beginnen, die zugrunde liegende Abbildung mit und



zu untersuchen ("mod 10" heißt hier, dass der Rest im Bereich 0..9 liegen soll). Z.B. ist diese Abbildung bijektiv:

.

Bei der Untersuchung der Zyklenlängen , d.h. solchen mit , stellt man fest, dass es

6 Zyklen der Länge ,
2 Zyklen der Länge ,
3 Zyklen der Länge und
1 Zyklus der Länge gibt.

Wie, bzw. ob überhaupt das für die ursprüngliche Problemstellung weiterhilft - keine Ahnung. Aber es ist ein Anfang.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »