[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[minion-cvs] Wrote how to decode messages.



Update of /home/minion/cvsroot/doc
In directory moria.seul.org:/tmp/cvs-serv28312

Modified Files:
	minion-spec.tex 
Log Message:
- Wrote how to decode messages. 
- Defined a way to recreate the SURB encryption key 
  using the seed, to maitain the stateless nature of SURBS.
- Commented on Payload encryption - quite important.



Index: minion-spec.tex
===================================================================
RCS file: /home/minion/cvsroot/doc/minion-spec.tex,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- minion-spec.tex	6 Aug 2002 15:59:16 -0000	1.52
+++ minion-spec.tex	14 Aug 2002 17:10:14 -0000	1.53
@@ -19,7 +19,10 @@
 
 5. Need to write: algorithm for processing a reply.
 
-   XXXX
+   XXXX The thing is done, Nick please check it for bugs, and to find
+   out if it is realistic. I still find it difficult to define the
+   difference between forward path and SURBed messages since we do not
+   have any special markers in the payload. -GD
 
 6. We should write the nymserver spec too. We can keep it pretty much
     separate from this Mixminion spec.
@@ -296,7 +299,7 @@
 Input: H1 (header containing keys SK1_1... SK1_N)
        and H2 (either a header containing keys SK2_1... SK2_N if
          we constructed it, or a header with unknown keys if we're
-         using a reply block.)
+         using a reply block and a SURB secret key.)
        P (Payload)
 Output: M (the message)
 
@@ -316,6 +319,7 @@
 		H2 = SPRP_ENC(SK1_i, "HEADER ENCRYPT",H2)
 		P = SPRP_ENC(SK1_i, "PAYLOAD ENCRYPT",P)
 	end
+	M = (H1, H2, P)
 
 \section{Processing of Messages}
 
@@ -348,6 +352,45 @@
 		Give (RT, RI, HASH(SK,``APPLICATION KEY''), P) to
 Module manager. 
 
+\section{Decoding of messages}
+
+Messages that are received by a client can either be sent using the
+forward path, or a SURB. They might either arrive in a mixminion
+format, that includes all the headers, or stripped of the two headers
+with only the a TAG field attached to them.
+
+A client that receives a message that is ultimately destined to them
+should perform the following operations to decode it:
+
+PROCEDURE: Decode a message.
+
+Input:  TAG field of sub-header or header where 
+        TAG = ( Encrypt(KEY, nHops | seed) | padding up to 44b).
+        M the body of the message.
+Output: P, the plaintext of the message.
+
+	If the message was sent using the forward-path then 
+		P = M; exit;
+	Otherwise, we regenerate all keys used to encrypt the payload:
+		(seed, nHops) = Decrypt(KEY,TAG)[0:17]
+		SK_1..SK_16 = PRNG(seed, nHops*16)[0:16*nhops]
+		For i = nHops to 0
+			M = SPRP_DEC(SK_i, ``PAYLOAD ENCRYPT'',M);
+		end
+
+		// We need here a convention for creating the
+		//   Encryption key in the SURB.
+		KEYX = HASH(seed| ``PRIVATE SURB KEY'')[0:16];
+		M = SPRP_DEC(KEYX,M);
+		
+		P = M; exit;
+
+[I am a bit uneasy that we have not defined any redundancy, or marker,
+that would allow the final recipient to decide if this is a forward
+path message or a SURBed message. Also the size of valid bytes has
+been scrapped, which does not help in extracting the valid bits from
+the junk. -GD]
+
 \section{Single Use Reply Block exchange formats}
 
 A SURB can be encoded in a standard binary or ASCII format.
@@ -392,6 +435,30 @@
     users.  George has suggested that we use PK instead, but generating
     a fresh RSA key for each SURB slows SURB generation down by a factor
     of 30-70.   Perhaps a two-mode system is in order.  Hmm. -NM]
+  [XXXX A bit more discussion on this topic: In fact there is, from an
+    anonymity point of view, very little to gain from using asymetric
+    crypto. The original point I had in mind had to do with
+    observability. If the key is symetric then crooked nodes can do
+    the following:
+	- observe all users noting which SURB's they are receiving.
+	  They can then note down the keys used.
+	- When a message is seen at a cross over point, all keys are
+    	  tried on it, making the forward path useless, since it can
+          be linked to a SURB received by someone specific.
+
+    My original idea was to use a key-private cryptosystem, to hide
+    which key was used to encrypt the payload.
+    I just realised that the above is rubish. If the SURB is not
+    delivered to receipient anonymously and privately, then it cannot
+    be used by the recipient anonymously, since it appears as it is in
+    the header of the packet at the crossover point. Therefore
+    symetric cryptography is as good as asymetric, key-privat in that
+    scenario. But this is a point we need to emphasise, that is
+    obvious when mentioned:
+
+	``Do not use SURB's that have been delivered non anonymously
+	for establishing sender-anonymous communications with others.''
+								-GD]
 
 The ASCII Encoding of SURBs.
 
@@ -418,6 +485,8 @@
            [nHops: 1 byte; seed: 16 bytes.]
 
 She uses PRNG(seed, nHops*16) to form the up-to-16 SK's for the reply.
+She also uses the seed to create the symetric key present in the SURB
+as KEYX = HASH(seed| ``PRIVATE SURB KEY'')[0:16];
 
 To understand a message later, the client need only remember (or be
 able to reconstruct) KEY.  
@@ -431,6 +500,7 @@
 
 [Note 2: 'Encrypt' here is not AES in counter mode; that would be
 madness.  Instead, we use AES in CBC mode.]
+[ XXXX if we use CBC mode we will need to use a different IV everytime -GD]
 
 \section{Replay Avoidance}