AEProtocol.h

Go to the documentation of this file.
00001 // Copyright (C) 2007 Alexey Myasnikov
00002 // Contents: Definition of classes for an attack on TTP algorithm 
00003 //
00004 //  This is an implementation of some element of AAGL2 (Algebraic Eraser) protocol described in 
00005 //  I. Anshel, M. Anshel,  D. Goldfeld, S. Lemieux, "Key Agreement, the Algebraic Eraser, and Lightweight Cryptography", 
00006 //  Algebraic Methods in Cryptography, CONM Vol 41 (2006), AMS, pp. 1-38
00007 
00008 //
00009 // Principal Authors: Alexey Myasnikov
00010 //
00011 // Revision History:
00012 //
00013 
00014 #ifndef _AEPROTOCOL_H_
00015 #define _AEPROTOCOL_H_
00016 
00017 #include "Word.h"
00018 #include "ThLeftNormalForm.h"
00019 #include <vector>
00020 #include <utility>
00021 
00022 using namespace std;
00023 
00024 class TTPTuple;
00025 
00027 //
00028 //    TTP Algorithm 
00029 //
00031 
00032 
00033 
00034 //
00035 //
00036 //  CONFIGURATION
00037 //
00038 //
00039 
00041 struct TTP_Conf{
00042 
00043         int nBL;
00044         int nBR;
00045         int N;
00046         int nGamma;
00047         
00048         int len_z;
00049         int len_w;
00050                 
00051   friend ostream& operator << (ostream& out, const TTP_Conf& ttp_conf){
00052         
00053         int len_z = 20;
00054         int len_w = 20;
00055     out << "        #BL :" <<  ttp_conf.nBL << endl;
00056     out << "        #BR :" <<  ttp_conf.nBR << endl;
00057     out << "          N :" <<  ttp_conf.N << endl;
00058     out << "      Gamma :" <<  ttp_conf.nGamma << endl;
00059     out << "      len z :" <<  ttp_conf.len_z << endl;
00060     out << "      len w :" <<  ttp_conf.len_w << endl;
00061                 
00062     return out;
00063   }
00064   
00065 };
00066 
00067 
00068 //
00069 //
00070 // Generator sets
00071 //
00072 //
00073 
00075 class BSets
00076 {
00077  public:
00078   vector<Word> BL;
00079   vector<Word> BR;
00080   
00082   static BSets generateRandom(int N);
00084   static BSets generateEqual(int N);
00085 
00087   friend ostream& operator << ( ostream& out, const BSets& bs ) {
00088     out << "BL{ ";
00089     for (int i=0;i<bs.BL.size();i++)
00090       out << bs.BL[i] << " , ";
00091     out << "} BR{ ";
00092     for (int i=0;i<bs.BR.size();i++)
00093       out << bs.BR[i] << " , ";
00094     out << "}";    
00095 
00096     return out;
00097   }
00098   
00099 };
00100 
00101 
00102 //
00103 //
00104 //  TTP TUPLE 
00105 //
00106 //
00108 class TTPTuple
00109 {
00110  public: 
00111   TTPTuple( ) {}
00112   TTPTuple( const vector< Word >& L, const vector< Word >& R):
00113     WL( L ),
00114     WR( R ) {}
00115     
00116     TTPTuple( const vector< Word >& L, const vector< Word >& R, const Word& conj):
00117       WL( L ),
00118       WR( R ),
00119       z( conj) {}
00120       
00121     vector<Word> WL;
00122     vector<Word> WR;
00123     
00124     
00126     int length() const;                 
00128     void shorten( int N );    
00130 
00134     bool testTuples( int N, bool details )const ;
00135     
00137     bool shortAndTestTuples( int N, bool details=false ) {
00138       shorten( N );
00139       return testTuples( N,details );
00140     }
00141     
00143     friend bool operator < ( const TTPTuple& t1, const TTPTuple& t2 ) {
00144       return t1.WL < t2.WL && t1.WR < t2.WR;
00145     }
00146     
00147     
00148     Word z;
00149  private:
00150     vector<Word> origWL;
00151     vector<Word> origWR;        
00152 };
00153 
00155 //
00156 //    AE PROTOCOL
00157 //
00159 
00160 
00161 //
00162 //
00163 //  MatrixFp: matrix over a finite field
00164 //
00165 //
00166 
00167 class MatrixFp
00168 {
00169         public:
00170                 MatrixFp( int n, int p ): the_n( n ), the_p( p ) { init(); }
00171                 ~MatrixFp() { clean(); }
00172                 MatrixFp( const MatrixFp& m );
00173                 MatrixFp& operator = (const MatrixFp& m);
00174                 
00175                 inline MatrixFp operator + ( const MatrixFp& w ) const;
00176                 inline MatrixFp operator * ( const MatrixFp& w ) const;
00177                 inline MatrixFp scalar_mult( int l ) const;  
00178                 MatrixFp getPower( int e )const;
00179                 
00180                 static MatrixFp random( int n, int p );
00181                 static MatrixFp ID( int n, int p );             
00182                 
00183                 void set(int i,int j, int v) { 
00184                         theMatrix[i][j] = v;
00185                 } 
00186         private:
00187         
00188         // METHODS
00189                 void init();
00190                 void clean();
00191         // DATA
00192                 int the_n;
00193                 int the_p;
00194 //              int** theMatrix;
00195                 vector< vector<int> > theMatrix;                
00196 };
00197 
00198 typedef pair<MatrixFp,Permutation> ProdElement;
00199 typedef pair<int,Permutation> BurauGenerator;
00200 
00201 
00202 class AEKeyExchange 
00203 {
00204         public:
00205                 AEKeyExchange( int n,int p, const TTPTuple& ttpt ):
00206                         the_n( n ), 
00207                         the_p( p ), 
00208                         theTTPTuple( ttpt ),
00209                         M0( MatrixFp::random(n,p) ) 
00210                         {
00211                         } 
00212                         
00213                 ProdElement alicePublicKey() {
00214                         int r = 10;
00215                         int m = 10;
00216                         int wl = 10;
00217                         generatePublicKey( theTTPTuple.WL , r , m , wl );
00218                 }
00219                 ProdElement bobPublicKey() {
00220                         int r = 10;
00221                         int m = 10;
00222                         int wl = 10;
00223                         generatePublicKey( theTTPTuple.WR , r , m , wl );
00224                 }
00225 
00226 
00227                 static TTPTuple generateTuples( const TTP_Conf& ttp_conf , const BSets& bs);
00228 
00229         private:
00230         
00231                 ProdElement starMult( const ProdElement& pe, const BurauGenerator& bg );
00232                 ProdElement generatePublicKey( const vector<Word>& v,  int r, int m, int wl );
00233                 
00234                 int the_n;
00235                 int the_p;
00236                 TTPTuple theTTPTuple;
00237                 MatrixFp M0;
00238 };
00239 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on Mon Sep 26 18:43:45 2011 for CRyptography And Groups (CRAG) by  doxygen 1.6.1