AES加密的问题

szqh97 2012-09-28 05:23:49
请教一下,使用AES cbc模式加密的时候,明文和密文的长度的关系是怎么样的?
...全文
236 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdxzw 2013-07-11
  • 打赏
  • 举报
回复
块加密的明文长度都有可能比密文短吧。 好像明文长度是块长度的整数倍时是一样长,别的情况下密文都比明文长
the_venus 2012-09-30
  • 打赏
  • 举报
回复
// 初始化
BOOL CAESAlg::Init(PBYTE pbPassword, DWORD dwLen, DWORD dwBlockSize)
{
if (pbPassword==NULL||dwLen<=0)
{
return FALSE;
}
if (dwBlockSize!=128&&
dwBlockSize!=192&&
dwBlockSize!=256)
{
return FALSE;
}
_dwBlockSize=(dwBlockSize>>3);

HCRYPTHASH hHash=NULL;

if (_hCryptProc)
{
CryptReleaseContext(_hCryptProc,0);
_hCryptProc=NULL;
}
if (_hKey)
{
CryptDestroyKey(_hKey);
_hKey=NULL;
}

if(!CryptAcquireContext(&_hCryptProc,NULL,MS_ENH_RSA_AES_PROV,PROV_RSA_AES,0))
{
return FALSE;
}

if (!CryptCreateHash(_hCryptProc,CALG_MD5,0,0,&hHash))
{
return FALSE;
}

if (!CryptHashData(hHash,pbPassword,dwLen,0))
{
return FALSE;
}
DWORD dwKeyLength=MAKE_KEYLENGTH(dwBlockSize);

ALG_ID id;
if (_dwBlockSize==16)
{
id=CALG_AES_128;
}
else if (_dwBlockSize==24)
{
id=CALG_AES_192;
}
else
{
id=CALG_AES_256;
}

if (!CryptDeriveKey(_hCryptProc,id,hHash,dwKeyLength,&_hKey))
{
return FALSE;
}
CryptDestroyHash(hHash);
return TRUE;
}

// 加密函数
BOOL CAESAlg::Encrypt(PBYTE pBuffer, DWORD dwBufferSize, LPDWORD pdwDataLen)
{
if (_hCryptProc==NULL||
_hKey==NULL)
{
return FALSE;
}
if (pBuffer==NULL||pdwDataLen==NULL)
{
return FALSE;
}

if (!CryptEncrypt(_hKey,NULL,TRUE,0,pBuffer,pdwDataLen,dwBufferSize))
{
return FALSE;
}

return TRUE;
}

// 解密函数
BOOL CAESAlg::Decrypt(PBYTE pData, LPDWORD pdwDataLen)
{
if (_hCryptProc==NULL||
_hKey==NULL)
{
return FALSE;
}
if (pData==NULL||pdwDataLen==NULL)
{
return FALSE;
}

if (!CryptDecrypt(_hKey,NULL,TRUE,0,pData,pdwDataLen))
{
return FALSE;
}
return TRUE;
}
the_venus 2012-09-30
  • 打赏
  • 举报
回复
#pragma once

#include <Windows.h>
#include <WinCrypt.h>

#define MAKE_KEYLENGTH(len)\
(len<<0x10)
//AES算法封装类
class CAESAlg
{
public:
CAESAlg(void);
public:
virtual ~CAESAlg(void);
public:
// 初始化
BOOL Init(PBYTE pbPassword, DWORD dwLen, DWORD dwBlockSize=128);
// 加密函数
BOOL Encrypt(PBYTE pBuffer, DWORD dwBufferSize, LPDWORD pdwDataLen);
// 解密函数
BOOL Decrypt(PBYTE pData, LPDWORD pdwDataLen);
private:
// CSP对象的句柄
HCRYPTPROV _hCryptProc;
// 加密解密密钥
HCRYPTKEY _hKey;
// 块大小
DWORD _dwBlockSize;

};

#include "StdAfx.h"
#include "AESAlg.h"

CAESAlg::CAESAlg(void)
: _dwBlockSize(16),
_hCryptProc(NULL),
_hKey(NULL)
{
}

CAESAlg::~CAESAlg(void)
{
if(_hKey)
{
CryptDestroyKey(_hKey);
_hKey=NULL;
}
if (_hCryptProc)
{
CryptReleaseContext(_hCryptProc,0);
_hCryptProc=NULL;
}
}



Oo纳兰筱DoO 2012-09-30
  • 打赏
  • 举报
回复
是一致的
bbggpig 2012-09-29
  • 打赏
  • 举报
回复
我也求大神指导
疯疯癫癫 2012-09-29
  • 打赏
  • 举报
回复
长度相等!

9,506

社区成员

发帖
与我相关
我的任务
社区描述
Windows专区 安全技术/病毒
社区管理员
  • 安全技术/病毒社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧