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);
}
Copyright © 2000 - 2010, Intel Corporation. All rights reserved.