Hallo Zusammen,
ich versuche den Algorithmus Spritz (nachfolger RC4) mit N=8 (bzw. verscgiedenen N) zum laufen zu bringen. Habe hier schon die entsprechenden Funktionen mit mod erweitert.
Wüsste jemand worauf ich noch achten muss. bzw. wie ich die Funktionen Absorb, AbsorbByte und AbsorbNibble ändern müsste?
https://people.csail.mit.edu/rivest/pubs/RS14.pdf
Vielen Dank im Voraus für Eure Hilfe.
Spritz(RC4) N=8
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Spritz(RC4) N=8
Das ist schon ein sehr spezielles Thema, ich habe diesen Algorithmus beispielsweise noch nicht gesehen.01110111 hat geschrieben: Wüsste jemand worauf ich noch achten muss. bzw. wie ich die Funktionen Absorb, AbsorbByte und AbsorbNibble ändern müsste?
Aber wenn Du fragst, was man ändern müsste, dann wäre es schon hilfreich zu wissen, wie die Funktionen bei Dir aussehen. ^^
Ansonsten kann ich nur auf Seite 3 des von Dir verlinkten PDFs verweisen.

Kaum abgeschickt... noch ein Gedanke... wenn die Frage sich auf das N=8 bezieht... warum solltest Du da etwas ändern müssen? Deine Nachricht ist kürzer als der Schlüssel, aber... wen stört's?
[Disclaimer: Ich habe den Algorithmus nie implementiert und die vorab stehenden Äußerungen entstammen aus einem durch Überfliegen der ersten Seiten und stellen keine qualifizierte Äußerung dar

Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Spritz(RC4) N=8
zu ändern sind folgende Funktionen.
Ich möchte das N variabel lassen. (d.h. auch für z.B. N=4 und N=6)
folgende Funktionen sind z.B. schon geändert.
Modulo wurde hier angepasst. (ist ja standardmäßig 256 muss aber ja für N= 8 etc. funktionieren)
Ich möchte das N variabel lassen. (d.h. auch für z.B. N=4 und N=6)
Code: Alles auswählen
void Spritz::spritz_absorb_stop(State *state)
{
unsigned char mod1 = getN();
if (state->a == getN() / 2) {
spritz_shuffle(state);
}
state->a++;
state->a = state->a % mod1;
}
void Spritz::spritz_absorb_nibble(State *state, const unsigned char x)
{
unsigned char y;
unsigned char mod1 = getN();
if (state->a == getN() / 2) {
spritz_shuffle(state);
}
y = getN() / 2 + x;
y = y % mod1;
std::swap( state->s[state->a], state->s[y] );
state->a++;
state->a = state->a % mod1;
}
void Spritz::spritz_absorb_byte(State *state, const unsigned char b)
{
if ( getN() == 4 )
{
unsigned char low = ( b & 1 );
unsigned char high = ( b >> 1 );
spritz_absorb_nibble(state, low );
spritz_absorb_nibble(state, high );
}
else if ( getN() == 6 )
{
assert(false);
spritz_absorb_nibble(state, ( b % m_D ));
spritz_absorb_nibble(state,
( static_cast<unsigned char>( static_cast<float>(b) / static_cast<float>(m_D) ) ) );
}
else if ( getN() == 8 )
{
spritz_absorb_nibble(state, ( b & 3 ));
spritz_absorb_nibble(state, ( b >> 2 ));
}
else
assert(false);
}
void Spritz::spritz_absorb(State *state, const unsigned char *msg, size_t length)
{
size_t v;
for (v = 0; v < length; v++) {
spritz_absorb_byte(state, msg[v]);
}
}
folgende Funktionen sind z.B. schon geändert.
Modulo wurde hier angepasst. (ist ja standardmäßig 256 muss aber ja für N= 8 etc. funktionieren)
Code: Alles auswählen
unsigned char Spritz::spritz_output(State *state)
{
unsigned char mod1 = getN();
const unsigned char y1 = (state->z + state->k) % mod1;
const unsigned char x1 = (state->i + state->s[y1]) % mod1;
const unsigned char y2 = (state->j + state->s[x1]) % mod1;
state->z = state->s[y2];
state->z = state->z % mod1;
return state->z;
}