Example of Using RSA Primitive Functions

Use of RSA Primitives 

static Ipp32u dataN[] = {
   0x091DBDCB,0x46F8E5FD,
   0xCA2A8F59,0xE2537298,0xF6C1687F,0x527A9A41,0x7B61A51F,0xE0AAB12D,
   0x4598394E,0x8834B245,0x06095374,0xEE6A649D,0xD93A2584,0x3EE6B4B7,
   0xDFC73772,0xAFB8E0A3,0x5B8B807F,0x19719D8A,0x60E1EC46,0x76ED520D,
   0xEB6FCD48,0x61EA48CE,0x035C02AB,0xB8DFBAAF,0x7454F51F,0x40D6B6F0,
   0xD41043A4,0x368D07EE,0x9DA871F7,0x2338AC2B,0x0682CE9C,0xBBF82F09
};
static Ipp32u dataP[] = {
   0x58FB6599,0x7541BA2A,0x459D1F39,0x5B252176,
   0xAA040A2D,0x7E28FAE7,0x6E5D1E3B,0x124EF023,0x3D84F632,0x93B81A9E,
   0xAEF4FDA4,0x99EB9F44,0xA1B56001,0x08810B10,0xB1B9B3C9,0xEECFAE81
};
static Ipp32u dataQ[] = {
   0xAF461503,0xA441E700,0x4D0416A5,0xCE335252,
   0x3204B5CF,0xEA0DA3B4,0x66B42E92,0x9840B416,0x028B9D86,0x5A0F2035,
   0x8866B1D0,0x3F6C42D0,0xAAD1D935,0x341233EA,0x27F453F6,0xC97FB1F0
};
static Ipp32u dataE[] = {0x11};
 
 
   int RSA_sample(void)
{
   BigNumber P(dataP, sizeof(dataP)/sizeof(dataP[0]));
   BigNumber Q(dataQ, sizeof(dataQ)/sizeof(dataQ[0]));
   BigNumber N = P*Q;
   BigNumber E(dataE, sizeof(dataE)/sizeof(dataE[0]));
   IppsRSAState* pRSApub  = newRSA(N.BitSize(), P.BitSize(), IppRSApublic);
   IppsRSAState* pRSAprv1 = newRSA(N.BitSize(), P.BitSize(), IppRSAprivate);
   IppsRSAState* pRSAprv2 = newRSA(N.BitSize(), P.BitSize(), IppRSAprivate);
 
   // compute private key
   BigNumber phi = (P-BigNumber(1))*(Q-BigNumber(1));
   BigNumber D = phi.InverseMul(E);
 
   // set up public RSA (N,E)
   ippsRSASetKey(N, IppRSAkeyN, pRSApub);
   ippsRSASetKey(E, IppRSAkeyE, pRSApub);
 
   // set up private (no CRT) RSA (N, D)
   ippsRSASetKey(N, IppRSAkeyN, pRSAprv1);
   ippsRSASetKey(D, IppRSAkeyD, pRSAprv1);
 
   // set up private (CRT) RSA (P,Q,D)
   ippsRSASetKey(P, IppRSAkeyP, pRSAprv2);
   ippsRSASetKey(Q, IppRSAkeyQ, pRSAprv2);
   ippsRSASetKey(D, IppRSAkeyD, pRSAprv2);
 
   // validate RSA
   IppsPRNGState* pRand = newPRNG();
   Ipp32u result;
   ippsRSAValidate(E, 50, &result, pRSAprv2, ippsPRNGen, pRand);

		
   if(IS_VALID_KEY!=result)
{
      cout <<"validation fail" <<endl;
      return 0;
   }
   // validation pass
 
   // planetext
   Ipp32u dataM[] = {
      0x4D353E2D,0xD2F1B76D,
      0x5281CE32,0x7BC27519,0x2F3AC14F,0x0448DB97,0xD095AEB4,0x82FB3E87,
      0x1BE392F9,0x43581159,0xD5024121,0xB48D2869,0x2BAAD29A,0xA1B7C136,
      0xF47728B4,0x4CDCFE4F,0x839A2DDB,0xFF8AE10E,0x25C9C2B3,0xF93EDCFB,
      0x4626F5AF,0xD7E0B2C0,0xB4251F84,0xC31B2E8B,0xA8F55267,0x5C68F1EE,
      0x26DCD87D,0xCA82310B,0x504B45E2,0x6350E329,0xACE9E300,0x00EB7A19
   };
   BigNumber M(dataM,sizeof(dataM)/sizeof(dataM[0]));
 
   // encrypt planetext
   BigNumber C(0,N.DwordSize());
   ippsRSAEncrypt(M, C, pRSApub);
 
   // decrypt ciphertext using pRSAprv1
   BigNumber Z1(0,N.DwordSize());
   ippsRSADecrypt(C, Z1, pRSAprv1);
 
 
   // decrypt ciphertext using pRSAprv2
   BigNumber Z2(0,N.DwordSize());
   ippsRSADecrypt(C, Z2, pRSAprv2);
		
   deleteRSA(pRSApub);
   deleteRSA(pRSAprv1);
   deleteRSA(pRSAprv2);
 
   return (M==Z1) && (M==Z2);
}
 

See Also

Submit feedback on this help topic

Copyright © 2000 - 2010, Intel Corporation. All rights reserved.