⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipp_cipher_twf.cpp

📁 这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数就可以编译该代码.
💻 CPP
字号:
/*
//
//               INTEL CORPORATION PROPRIETARY INFORMATION
//  This software is supplied under the terms of a license agreement or
//  nondisclosure agreement with Intel Corporation and may not be copied
//  or disclosed except in accordance with the terms of that agreement.
//        Copyright (c) 2005 Intel Corporation. All Rights Reserved.
//
*/

#include "ipp_cipher_twf.h"
#include <string.h>

//////////////////////////////////////////////////
//
// cipher: Twofish
//
TWF::TWF(const Ipp8u* pKey, int keyLen)
{
   algoBlockSize = TWF_BLKLEN;

   int ctxSize;
   ippsTwofishGetSize(&ctxSize); 
   pCtx = (IppsTwofishSpec*)( new Ipp8u [ctxSize] );

   ResetKey(pKey, keyLen);
}

void TWF::ResetKey(const Ipp8u* pKey, int keyLen)
{
   Ipp8u key[TF_KEYSIZE_MIN/8];

   if(keyLen*8 < TF_KEYSIZE_MIN) {
      memset(key, 0, sizeof(key));
      memcpy(key, pKey, keyLen);
      keyLen = TF_KEYSIZE_MIN/8;
      pKey = key;
   }
   if(keyLen*8 > TF_KEYSIZE_MAX)
      keyLen = TF_KEYSIZE_MAX/8;

   ippsTwofishInit(pKey, keyLen, pCtx);
}

TWF::~TWF()
{
   delete [] (Ipp8u*)pCtx;
}

int TWF::doCipher(Ipp8u* pDst, const Ipp8u* pSrc, int srcLen)
{
   Ipp8u newIV[TWF_BLKLEN];

   switch (mode) {
      case ECB:
         status = ENCRYPT==operation?
                  ippsTwofishEncryptECB(pSrc, pDst, srcLen, pCtx, NONE):
                  ippsTwofishDecryptECB(pSrc, pDst, srcLen, pCtx, NONE);
         break;
      case CBC:
         if(ENCRYPT==operation) {
            status = ippsTwofishEncryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
            memcpy(iv, pDst+srcLen-TWF_BLKLEN, TWF_BLKLEN);
         }
         else {
            memcpy(newIV, pSrc+srcLen-TWF_BLKLEN, TWF_BLKLEN);
            status = ippsTwofishDecryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
            memcpy(iv, newIV, TWF_BLKLEN);
         }
         break;
      case CFB:
         if(ENCRYPT==operation) {
            status = ippsTwofishEncryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
            if(srcLen<TWF_BLKLEN) {
               memcpy(iv, iv+srcLen, TWF_BLKLEN-srcLen);
               memcpy(iv+TWF_BLKLEN-srcLen, pDst, srcLen);
            }
            else
               memcpy(iv, pDst+srcLen-TWF_BLKLEN, TWF_BLKLEN);
         }
         else {
            if(srcLen<TWF_BLKLEN) {
               memcpy(newIV, iv+srcLen, TWF_BLKLEN-srcLen);
               memcpy(newIV+TWF_BLKLEN-srcLen, pSrc, srcLen);
            }
            else
               memcpy(newIV, pSrc+srcLen-TWF_BLKLEN, TWF_BLKLEN);
            status = ippsTwofishDecryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
            memcpy(iv, newIV, TWF_BLKLEN);
         }
         break;
      case CTR:
         status = ENCRYPT==operation?
                  ippsTwofishEncryptCTR(pSrc, pDst, srcLen, pCtx, iv, param):
                  ippsTwofishDecryptCTR(pSrc, pDst, srcLen, pCtx, iv, param);
         break;
      default:
         return 0; // unsupported mode
   }
   return ippStsNoErr==status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -