Spritz(RC4) N=8

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Spritz(RC4) N=8

Beitrag von 01110111 » Fr Okt 20, 2017 9:06 am

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8469
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Spritz(RC4) N=8

Beitrag von Xin » Fr Okt 20, 2017 10:25 am

01110111 hat geschrieben: Wüsste jemand worauf ich noch achten muss. bzw. wie ich die Funktionen Absorb, AbsorbByte und AbsorbNibble ändern müsste?
Das ist schon ein sehr spezielles Thema, ich habe diesen Algorithmus beispielsweise noch nicht gesehen.
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.

01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Re: Spritz(RC4) N=8

Beitrag von 01110111 » Fr Okt 20, 2017 11:08 am

zu ändern sind folgende Funktionen.
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;
}

Antworten