Intel IPP密码库 IPPCP 2018——第二部分 对称密码算法开发说明与示例代码
2. Symmetric Cryptography
2.1加解密步骤
其中<Alg>指具体的密码算法,<Mode>指ECB、CBC、OFB、CFB、CTR模式。
执行步骤:
步骤1. 获取ctx大小:ipps<Alg>GetSize(int* pSize);其中<Alg>指具体的密码算法。
步骤2. 内存分配:pCtx = malloc(Size),分配Size字节内存给密码算法的pCtx;
步骤3. 初始化(密钥扩展):ipps<Alg>Init,需指定密钥。
步骤4. 加解密:调用ipps<Alg>Encrypt<Mode>或者ipps<Alg>Decrypt<Mode>,这里要设定IV,且IV在执行后会变化。
步骤5. 反初始化(数据清除):调用ipps<Alg>Init,但让key置为NULL。
步骤6. 内存释放:free(pCtx)。
注:
1. 还有个ipps<Alg>SetKey用于重新设定密钥,功能与ipps<Alg>Init类似;两者差异未知,猜测可能Init涉及一些别的特殊操作。
2.2 支持的密码算法和工作模式
表X 支持的密码算法和工作模式
模式算法 |
AES |
TDES/DES |
SM4 |
ARCFour |
ECB |
Y |
Y |
Y |
RC4为流密码 |
CBC |
Y |
Y |
Y |
|
CFB |
Y |
Y |
Y |
|
OFB |
Y |
Y |
Y |
|
CTR |
Y |
Y |
Y |
|
CCM |
Y |
X |
Y(2018版) |
|
GCM |
Y |
X |
X |
|
XTS |
Y |
X |
X |
|
SIV |
Y |
X |
X |
补充说明
- TDES = DES加密(K1) → DES解密(K2) → DES加密(K1) 。
- ARCFour即RC4算法。
- CCM、GCM、SIV为认证加密模式;XTS为磁盘加密模式。
2.3 函数说明
2.3.1 获取上下文大小GetSize
IppStatus ippsAESGetSize(int* pSize);
IppStatus ippsDESGetSize(int* pSize);
IppStatus ippsSMS4GetSize(int* pSize);
IppStatus ippsARCFourGetSize(int* pSize);
参数说明
- pSize:OUT,CTX大小,单位字节。
2.3.2 初始化和反初始化Init
IppStatus ippsAESInit(const Ipp8u* pKey, int keylen, IppsAESSpec* pCtx, int ctxSize);
IppStatus ippsDESInit(const Ipp8u* pKey, IppsDESSpec* pCtx);
IppStatus ippsSMS4Init(const Ipp8u* pKey, int keyLen, IppsSMS4Spec* pCtx, int ctxSize);
IppStatus ippsARCFourInit(const Ipp8u* pKey, int keyLen, IppsARCFourState* pCtx);
参数说明
- pKey:IN,密钥。
- keyLen:IN,密钥字节长度。
- pCtx:OUT,密码算法上下文。
- ctxSize:IN,CTX大小,单位字节。
补充说明
- SM4的密钥长度必须是16。RC4密钥长度为1—256字节。
- 将pKey设置为NULL则执行反初始化。
- TDES需要对三个密钥各执行ippsDESInit以初始化三个IppsDESSpec*。
2.3.3 重置密钥SetKey
仅AES和SM4有重置密钥函数
IppStatus ippsAESSetKey(const Ipp8u* pKey, int keylen, IppsAESSpec* pCtx);
IppStatus ippsSMS4SetKey(const Ipp8u* pKey, int keyLen, IppsSMS4Spec* pCtx);
参数说明
- pKey:IN,密钥。
- keyLen:IN,密钥字节长度。
- pCtx:OUT,密码算法上下文。
补充说明
- pCtx必须是已经Init了的才能调用此函数。
2.3.4 上下文导入导出Pack/Unpack
SM4无上下文导入导出。
IppStatus ippsAESPack (const IppsAESSpec* pCtx, Ipp8u* pBuffer, int bufSize);
IppStatus ippsAESUnpack (const Ipp8u* pBuffer, IppsAESSpec* pCtx, int ctxSize);
IppStatus ippsDESPack (const IppsDESSpec* pCtx, Ipp8u* pBuffer);
IppStatus ippsDESUnpack (const Ipp8u* pBuffer, IppsDESSpec* pCtx);
IppStatus ippsARCFourPack (const IppsARCFourState* pCtx, Ipp8u* pBuffer);
IppStatus ippsARCFourUnpack (const Ipp8u* pBuffer, IppsARCFourState* pCtx);
参数说明
(A)导出/Pack时
- pCtx:IN,上下文。
- pBuffer:OUT,导出缓冲区。
- bufSize:IN,有的函数无。
(B)导入/Unpack时
- pBuffer:IN,导入缓冲区。
- pCtx:OUT,上下文。
- ctxSize:IN,上下文。
备注:
- 无论缓冲区pBuffer字节大小还是上下文pCtx字节大小,都调用ipps***GetSize获得。
- SM4无上下文导入导出。
- AES有bufSize和ctxSize是因为AES的密钥有三种长度,使得其buf和ctx不定长。
2.3.5 AES加解密
IppStatus ippsAESEncryptECB( const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsAESSpec* pCtx);
IppStatus ippsAESDecryptECB( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx);
IppStatus ippsAESEncryptCBC( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESDecryptCBC( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESEncryptCFB( const Ipp8u* pSrc, Ipp8u* pDst, int srcLen, int cfbBlkSize, const IppsAESSpec* pCtx, const Ipp8u *pIV);
IppStatus ippsAESDecryptCFB( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, int cfbBlkSize, const IppsAESSpec* pCtx, const Ipp8u*pIV);
IppStatus ippsAESEncryptOFB ( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, int ofbBlkSize, const IppsAESSpec* pCtx, Ipp8u* pIV);
IppStatus ippsAESDecryptOFB ( const Ipp8u* pSrc, Ipp8u* pDst, int srclen, int ofbBlkSize, const IppsAESSpec* pCtx, Ipp8u* pIV);
IppStatus ippsAESEncryptCTR( const Ipp8u* pSrc, Ipp8u* pDst, int srcLen,const IppsAESSpec* pCtx, Ipp8u* pCtrValue , int ctrNumBitSize);
IppStatus ippsAESDecryptCTR( const Ipp8u* pSrc, Ipp8u* pDst, int srcLen,const IppsAESSpec* pCtx, Ipp8u* pCtrValue, int ctrNumBitSize);
以下是在2018版中发现的新增接口,CBC的CS模式,2017版无。
IppStatus ippsAESEncryptCBC_CS1 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESEncryptCBC_CS2 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESEncryptCBC_CS3 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESDecryptCBC_CS1 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESDecryptCBC_CS2 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
IppStatus ippsAESDecryptCBC_CS3 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsAESSpec* pCtx, const Ipp8u* pIV);
表X 参数列表
AES |
pSrc |
pDst |
srcLen |
pCtx |
pIV |
其它 |
ECB |
Y |
Y |
Y |
Y |
— |
— |
CBC |
Y |
Y |
Y |
Y |
Y |
— |
CBC_CS1 |
Y |
Y |
Y |
Y |
Y |
— |
CBC_CS2 |
Y |
Y |
Y |
Y |
Y |
— |
CBC_CS3 |
Y |
Y |
Y |
Y |
Y |
— |
CFB |
Y |
Y |
Y |
Y |
Y |
cfbBlkSize |
OFB |
Y |
Y |
Y |
Y |
Y |
ofbBlkSize |
CTR |
Y |
Y |
Y |
Y |
— |
pCtrValue ctrNumBitSize |
参数说明
- pSrc:IN,加密时为明文,解密时为密文。
- srclen:IN,Src的字节长度。
- pDst:OUT,加密时为密文,解密时为明文。长度等于srclen。
- pCtx:IO,密码算法上下文。
- pIV:IO,初始化向量,长度同分组大小,调用后会改变。ECB无。
- pCtrValue:IO,CTR的计数器,相当于其它模式的初始化向量。
- ctrNumBitSize:IN,计数器中有效的计数比特长度(从右端计)。
- cfbBlkSize/ ofbBlkSize:CFB/OFB每拍输出的密钥流字节数,小于分组大小。
备注1:CBC_CS采用密文偷取技术,使得数据多次加密时使用不便。因此,建议这种模式下一次性输入完毕明文/密文。
备注2:srcLen长度说明。
表X srcLen说明
AES |
srcLen |
ECB |
16 | srcLen |
CBC |
16 | srcLen |
CFB |
cfbBlkSize | srcLen |
OFB |
ofbBlkSize | srcLen |
CTR |
任意长度。 但非最后一次调用时都要求16 | srcLen |
CTR中srcLen长度的进一步说明
若srcLen不是16的整数倍,则生成的多余的密钥流会被丢弃。下次再送入数据时,会用新的CTR值加密作为密钥流。
例如,第1次送入33字节,第二次再送入31字节。第一次生成48字节密钥流,前33字节密钥流用于加密,后15字节密钥流丢弃;第二次重新产生32字节,前31字节密钥流用于加密,后1字节密钥流丢弃。这样一来,由于第一次加密时丢弃了15字节密钥流,就导致了其加密结果和我们期望的结果不一致。
2.3.6 AES其它模式
AES加密认证涉及CCM、GCM、SIV,详情参见官方文档。本文档略。
AES磁盘加密涉及XTS模式,详情参见官方文档。本文档略。
2.3.7 TDES加解密
IppStatus ippsTDESEncryptECB(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec * pCtx3, IppsCPPadding padding);
IppStatus ippsTDESDecryptECB(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec * pCtx3, IppsCPPadding padding);
IppStatus ippsTDESEncryptCBC(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec * pCtx3, const Ipp8u *pIV, IppsCPPadding padding);
IppStatus ippsTDESDecryptCBC(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec * pCtx3, const Ipp8u *pIV, IppsCPPadding padding);
IppStatus ippsTDESEncryptCFB(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, int cfbBlkSize, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3, const Ipp8u *pIV, IppsCPPadding padding);
IppStatus ippsTDESDecryptCFB(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, int cfbBlkSize, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3, const Ipp8u *pIV, IppsCPPadding padding);
IppStatus ippsTDESEncryptOFB (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, int ofbBlkSize, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3, Ipp8u* pIV);
IppStatus ippsTDESDecryptOFB (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, int ofbBlkSize, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3, Ipp8u* pIV);
IppStatus ippsTDESEncryptCTR(const Ipp8u *pSrc, Ipp8u *pDst, int srclen, const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3,Ipp8u *pCtrValue, int ctrNumBitSize);
IppStatus ippsTDESDecryptCTR(const Ipp8u *pSrc, Ipp8u *pDst, int srcLen,const IppsDESSpec *pCtx1, const IppsDESSpec *pCtx2, const IppsDESSpec *pCtx3, Ipp8u *pCtrValue, int ctrNumBitSize);
表X 参数列表
TDES |
pSrc |
pDst |
srcLen |
pCtx1-3 |
pIV |
padding |
其它 |
ECB |
Y |
Y |
Y |
Y |
— |
Y |
— |
CBC |
Y |
Y |
Y |
Y |
Y |
Y |
— |
CFB |
Y |
Y |
Y |
Y |
Y |
Y |
cfbBlkSize |
OFB |
Y |
Y |
Y |
Y |
Y |
— |
ofbBlkSize |
CTR |
Y |
Y |
Y |
Y |
— |
— |
pCtrValue ctrNumBitSize |
参数说明
- pSrc:IN,加密时为明文,解密时为密文。
- srclen:IN,Src的字节长度。
- pDst:OUT,加密时为密文,解密时为明文。长度等于srclen。
- pCtx1,pCtx2,pCtx3:IO,密码算法上下文,三个密钥对应三个上下文。
- pIV:IO,初始化向量,长度同分组大小,调用后会改变。ECB无。
- padding:IN,目前好像只支持IppsPaddingNONE(不填充)。具体待查。
- pCtrValue:IO,CTR的计数器,相当于其它模式的初始化向量。
- ctrNumBitSize:IN,计数器中有效的计数比特长度(从右端计)。
- cfbBlkSize/ ofbBlkSize:CFB/OFB每拍输出的密钥流字节数,小于分组大小。
备注:
- padding:具体待查。
2.3.8 SM4加解密
IppStatus ippsSMS4EncryptECB(const Ipp8u *pSrc, Ipp8u *pDst, int len, const IppsSMS4Spec* pCtx);
IppStatus ippsSMS4DecryptECB(const Ipp8u* pSrc, Ipp8u* pDst, int len, const IppsSMS4Spec* pCtx);
IppStatus ippsSMS4EncryptCBC(const Ipp8u* pSrc, Ipp8u* pDst, int len, const IppsSMS4Spec* pCtx, const Ipp8u* pIV);
IppStatus ippsSMS4DecryptCBC(const Ipp8u* pSrc, Ipp8u* pDst, int len, const IppsSMS4Spec* pCtx, const Ipp8u* pIV);
IppStatus ippsSMS4EncryptCFB(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize, const IppsSMS4Spec* pCtx, const Ipp8u *pIV);
IppStatus ippsSMS4DecryptCFB(const Ipp8u* pSrc, Ipp8u* pDst, int len, int cfbBlkSize, const IppsSMS4Spec* pCtx, const Ipp8u* pIV);
IppStatus ippsSMS4EncryptOFB (const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize, const IppsSMS4Spec* pCtx, Ipp8u* pIV);
IppStatus ippsSMS4DecryptOFB (const Ipp8u* pSrc, Ipp8u* pDst, int len, int ofbBlkSize, const IppsSMS4Spec* pCtx, Ipp8u* pIV);
IppStatus ippsSMS4EncryptCTR(const Ipp8u* pSrc, Ipp8u* pDst, int len, const IppsSMS4Spec* pCtx, Ipp8u* pCtrValue , int ctrNumBitSize);
IppStatus ippsSMS4DecryptCTR(const Ipp8u* pSrc, Ipp8u* pDst, int len, const IppsSMS4Spec * pCtx, Ipp8u* pCtrValue, int ctrNumBitSize);
以下是在2018版中发现的新增接口,CBC的CS模式,2017版无。
IppStatus ipps SMS4EncryptCBC_CS1 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
IppStatus ipps SMS4EncryptCBC_CS2 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
IppStatus ipps SMS4EncryptCBC_CS3 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
IppStatus ipps SMS4DecryptCBC_CS1 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
IppStatus ipps SMS4DecryptCBC_CS2 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
IppStatus ipps SMS4DecryptCBC_CS3 (const Ipp8u* pSrc, Ipp8u* pDst, int srclen, const IppsSMS4Spec * pCtx, const Ipp8u* pIV);
表X 参数列表
SM4 |
pSrc |
pDst |
srcLen |
pCtx |
pIV |
其它 |
ECB |
Y |
Y |
Y |
Y |
— |
— |
CBC |
Y |
Y |
Y |
Y |
Y |
— |
CBC-CS1 |
Y |
Y |
Y |
Y |
Y |
— |
CBC-CS2 |
Y |
Y |
Y |
Y |
Y |
— |
CBC-CS3 |
Y |
Y |
Y |
Y |
Y |
— |
CFB |
Y |
Y |
Y |
Y |
Y |
cfbBlkSize |
OFB |
Y |
Y |
Y |
Y |
Y |
ofbBlkSize |
CTR |
Y |
Y |
Y |
Y |
— |
pCtrValue ctrNumBitSize |
参数说明
- pSrc:IN,加密时为明文,解密时为密文。
- srclen:IN,Src的字节长度。
- pDst:OUT,加密时为密文,解密时为明文。长度等于srclen。
- pCtx:IO,密码算法上下文。
- pIV:IO,初始化向量,长度同分组大小,调用后会改变。ECB无。
- pCtrValue:IO,CTR的计数器,相当于其它模式的初始化向量。
- ctrNumBitSize:IN,计数器中有效的计数比特长度(从右端计)。
- cfbBlkSize/ ofbBlkSize:CFB/OFB每拍输出的密钥流字节数,小于分组大小。
备注1:CBC_CS采用密文偷取技术,使得数据多次加密时使用不便。因此,建议这种模式下一次性输入完毕明文/密文。
备注2:srcLen长度说明。
表X srcLen说明
AES |
srcLen |
ECB |
16 | srcLen |
CBC |
16 | srcLen |
CFB |
cfbBlkSize | srcLen |
OFB |
ofbBlkSize | srcLen |
CTR |
任意长度。 但非最后一次调用时都要求16 | srcLen |
CTR中srcLen长度的进一步说明
若srcLen不是16的整数倍,则生成的多余的密钥流会被丢弃。下次再送入数据时,会用新的CTR值加密作为密钥流。
例如,第1次送入33字节,第二次再送入31字节。第一次生成48字节密钥流,前33字节密钥流用于加密,后15字节密钥流丢弃;第二次重新产生32字节,前31字节密钥流用于加密,后1字节密钥流丢弃。这样一来,由于第一次加密时丢弃了15字节密钥流,就导致了其加密结果和我们期望的结果不一致。
2.3.8 SM4-CCM加解认证
在2018版中发现有SM4-CCM,但是SM4执行CCM的可能性较低,所以本部分略。
2.3.9 ARCFour加解密
ARCFour即RC4流密码。本部分略。
2.4 示例代码
2.4.1 AES示例代码
#include “ippcp.h”
// use of the CTR mode
int AES_sample(void)
{
// secret key
Ipp8u key[] = "\x00\x01\x02\x03\x04\x05\x06\x07"
"\x08\x09\x10\x11\x12\x13\x14\x15";
// define and setup AES cipher
int ctxSize;
ippsAESGetSize(&ctxSize);
IppsAESSpec* pAES = (IppsAESSpec*)( new Ipp8u [ctxSize] );
ippsAESInit(key, sizeof(key)-1, pAES, ctxSize);
// message to be encrypted
Ipp8u msg[] = "the quick brown fox jumps over the lazy dog";
// and initial counter
Ipp8u ctr0[] = "\xff\xee\xdd\xcc\xbb\xaa\x99\x88"
"\x77\x66\x55\x44\x33\x22\x11\x00";
// counter
Ipp8u ctr[16];
// init counter before encryption
memcpy(ctr, ctr0, sizeof(ctr));
// encrypted message
Ipp8u ctext[sizeof(msg)];
// encryption
ippsAESEncryptCTR(msg, ctext, sizeof(msg), pAES, ctr, 64);
// init counter before decryption
memcpy(ctr, ctr0, sizeof(ctr));
// decrypted message
Ipp8u rtext[sizeof(ctext)];
// decryption
ippsAESDecryptCTR(ctext, rtext, sizeof(ctext), pAES, ctr, 64);
// remove secret and release resource
ippsAESInit(0, sizeof(key)-1, pAES, ctxSize);
delete [] (Ipp8u*)pAES;
int error = memcmp(rtext, msg, sizeof(msg));
return 0==error;
}
2.4.2 TDES示例代码
// Use of the ECB mode
void TDES_sample(void){
// size of the TDES algorithm block is equal to 8
const int tdesBlkSize = 8;
// get size of the context needed for the encryption/decryption operation
int ctxSize;
ippsDESGetSize(&ctxSize);
// and allocate one
IppsDESSpec* pCtx1 = (IppsDESSpec*)( new Ipp8u [ctxSize] );
IppsDESSpec* pCtx2 = (IppsDESSpec*)( new Ipp8u [ctxSize] );
IppsDESSpec* pCtx3 = (IppsDESSpec*)( new Ipp8u [ctxSize] );
// define the key
Ipp8u key1[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
Ipp8u key2[] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
Ipp8u key3[] = {0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28};
Ipp8u keyX[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// and prepare the context for the TDES usage
ippsDESInit(key1, pCtx1);
ippsDESInit(key2, pCtx2);
ippsDESInit(key3, pCtx3);
// define the message to be encrypted
Ipp8u ptext[] = {"the quick brown fox jumps over the lazy dog"};
// allocate enough memory for the ciphertext
// note that
// the size of ciphertext is always a multiple of the cipher block size
Ipp8u ctext[(sizeof(ptext)+desBlkSize-1) &~(desBlkSize-1)];
// encrypt (ECB mode) ptext message
// pay attention to the 'length' parameter
// it defines the number of bytes to be encrypted
ippsTDESEncryptECB(ptext, ctext, sizeof(ctext), pCtx1, pCtx2, pCtx3, IppsCPPaddingNONE);
// allocate memory for the decrypted message
Ipp8u rtext[sizeof(ctext)];
// decrypt (ECB mode) ctext message
// pay attention to the 'length' parameter
// it defines the number of bytes to be decrypted
ippsTDESDecryptECB(ctext, rtext, sizeof(ctext), pCtx1, pCtx2, pCtx3, IppsCPPaddingNONE);
// remove actual secret from contexts
ippsDESInit(keyX, pCtx1);
ippsDESInit(keyX, pCtx2);
ippsDESInit(keyX, pCtx3);
// release resources
delete (Ipp8u*)pCtx1;
delete (Ipp8u*)pCtx2;
delete (Ipp8u*)pCtx3;
}
Intel IPP密码库 IPPCP 2018——第二部分 对称密码算法开发说明与示例代码相关推荐
- 利用Intel IPP函数库实现信号频谱计算
Intel IPP(Intel Integrated Performance Primitives)函数库是一套跨平台的软件函数库,它为用户提供了一套高效.实用的函数集,可用于实现通信.图像.语音等多 ...
- python登录网页账号密码_Python 通过爬虫实现GitHub网页的模拟登录的示例代码
1. 实例描述 通过爬虫获取网页的信息时,有时需要登录网页后才可以获取网页中的可用数据,例如获取 GitHub 网页中的注册号码时,就需要先登录账号才能在登录后的页面中看到该信息,如下图所示.那么该如 ...
- 使用python的scapy库,提供一个发送nbns询问包的一个示例代码
以下是使用scapy库发送NBNS询问包的示例代码: from scapy.layers.dns import DNSQR, NBNSQueryRequest from scapy.sendrecv ...
- 使用python的scapy库,提供一个通过nbns获取主机名称的示例代码
以下是使用scapy库通过nbns协议获取主机名称的示例代码: from scapy.all import *def get_hostname_by_nbns(ip):hostname = " ...
- python3多线程第三方库_Python之多线程爬虫抓取网页图片的示例代码
目标 嗯,我们知道搜索或浏览网站时会有很多精美.漂亮的图片. 我们下载的时候,得鼠标一个个下载,而且还翻页. 那么,有没有一种方法,可以使用非人工方式自动识别并下载图片.美美哒. 那么请使用pytho ...
- linux unrar 密码,linux下使用unrar命令解压*.rar格式文件(示例代码)
使用帮助 [[email protected] ~]$ unrar UNRAR 5.40 freeware Copyright (c) 1993-2016 Alexander Roshal ...
- All-In-One Code Framework [一站式示例代码库] 【转】
All-In-One Code Framework [一站式示例代码库] 2010 对一站式示例代码库,对奋战在一站式示例代码库上的每一位工程师来说都是不同寻常的一年. 在我们共同努力和开发社区的支持 ...
- Intel IPP库概述,合计共5000个函数
"英特尔IPP"为开发人员提供了高质量.支持生产的低级构造块,用于图像处理.信号处理和数据处理(数据压缩/解压缩和加密)应用程序.它是针对各种Intel架构(Intel®Quark ...
- Qt Creator配置Intel IPP库并实现信号带通滤波
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一.环境参数 二.添加步骤 1.安装IPP2018 2.配置环境变量 3.引入lib文件 三. 测试 输出结果 ...
最新文章
- 综述 | 深度学习中的优化理论
- POJ-3662 Telephone Lines 二分+双端队列
- XSS的原理分析与解剖
- swaagerui2 与guava_Swagger使用总结
- mysql端口转发_SSH做MySQL端口转发
- Web渗透实验:基于Weblogic的一系列漏洞
- flume简介(大数据技术)
- Springboot的web开发-静态资源
- java 文件下载预览_javaweb简单的实现文件下载及预览
- 51nod1417 天堂里的游戏
- R可能让您惊喜的10件事
- DDD~microsoft NLayerApp项目中的层次结构图
- Atitit gc 垃圾回收原理与概论and 自动资源管理的艺术 v2 1. 为什么需要gc	1 1.1. 如果长期不被释放,可能导致OOM。	1 1.2. ,目的在于防止由程序猿引入的人为的内存
- [Spring Boot 系列] 集成maven和Spring boot的profile功能
- Clover 驱动文件夹_声卡驱动的另一个办法(ppleHDA Patcher软件说明)
- 【ENVI解决经验】裁剪后背景改为白色(透明)
- lsof恢复被rm -rf命令删除的文件
- JavaWeb之Request与Response详解
- 计算机画图调整画笔粗细,【2人回答】画图里画笔怎么加粗-3D溜溜网
- Python入门(四):Python变量
热门文章
- Excel中如何让第一行、第二行一直显示出来 excel冻结窗格与拆分窗格
- 卫生事业单位计算机科学与技术,卫生事业单位考试-计算机科学与技术的知识点.doc...
- 制作linux只读文件系统,一种Squashfs只读根文件系统的远程升级方法及系统的制作方法...
- 电子信息工程要考研吗?
- Android计步器算法实现
- usb_host_dll
- verilog中pullup和pulldown的用法
- C# DevExpress 皮肤控件记住设置
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译
- java 根据环境导包_java环境变量配置原理解析以及eclipse导入外包的方法