实现密码分组链接(CBC)模式需要一个初始化向量(InitializationVectorIV),该微量是通过将安全关联(SecurityAssociation,SA)中的初始化向量(1V)参数与物理层同步域内容进行异或(ExclusiveOR,XOR)运算得到的。CBCIV的计算方法是:在下行链路上,CBC的初始化是通过将TEK密钥信息中的IV参数与最新DL-MAP中的物理层同步域的内容进行异或运算来实现的;在上行链路上,CBC的初始化是通过将TEK密钥信息中的IV参数与DL-MAP中的物理层同步域的内容进行异或运算来实现的,这个DL—MAP在当前UL-MAP被创建或接收到时必须是有效的。
DES加密过程使用连接安全关联中的初始化向量(1V)和传输加密密钥(TrafficEncryptionKey,TEK),来对PDU载荷进行加密。然后,密文载荷代替原始明文载荷。GMH中的EC(En-cryptionControl,加密控制)位为1时,表示对载荷进行加密操作;加密密钥序列(EncryptionKeySequence,EKS)字段只有在EC字段设置成1时才有效,用于表示传输加密密钥和初始向量的序号将被用于载荷加密。对于新的密文载荷,如果包含了CRC,则需要对其进行更新。
总体而言,DES-CBC加密方案具有较低的安全性,这一方面是由于DES算法本身的脆弱性造成的,另一方面是用于这种加密方法的数据封装没有完整性和抗重放保护机制。
CBC模式下的数据加密和解密详细描述
Cipher-blockchaining(CBC)是一种加密方式,它将纯文本分块和之前加密的密文块进行XOR操作。这里每个密文块都取决于纯文本的这种处理。注意要确保消息独立,并在第一个块中使用初始向量。
SymbianCryptographylibrary的CModeCBCEncryptor可以用来加密数据,它使用CBlockTransformation子类在它随后拥有的CAESEncryptor中进行初始化。下列代码演示了对CBC模式下的数据块加密和解密的操作。
解决方案
CBC模式下对数据的加密
复制到剪贴板C/C++代码
1.voidCCBCExAppUi::CBCEncryption(TPtr8&aDataPtr){CAESEncryptor*aesEncryptor=CAESEncryptor::NewL(iCipherkey);CModeCBCEncryptor*cbcEncryptor=CModeCBCEncryptor::NewLC(aesEncryptor,
iIV);
for(TInti=0;i<3;i++){TPtr8tempDataptr=aDataPtr.MidTPtr(16*i,16);cbcEncryptor->Transform(tempDataptr);cbcEncryptor->SetIV(tempDataptr);}
CleanupStack::PopAndDestroy();}
CBC模式下对数据的解密:
复制到剪贴板C/C++代码1.voidCCBCExAppUi::CBCDecryption(TPtr8&aDataPtr){CAESDecryptor*aesdecryptor=CAESDecryptor::NewL(iCipherkey);CModeCBCDecryptor*cbcDecryptor=CModeCBCDecryptor::NewLC(aesdecryptor,iIV);
TBuf8<16>tempBuf;for(TInti=0;i<3;i++){TPtr8tempDataptr=aDataPtr.MidTPtr(16*i,16);tempBuf.Copy(tempDataptr);cbcDecryptor->Transform(tempDataptr);cbcDecryptor->SetIV(tempBuf);}
CleanupStack::PopAndDestroy();}
2.////////////////////////////////////////////
//Thismodulesisthemain()
//author:JingJiandu
//2002-11-25
//notes:theblocklengthis16bytes
////////////////////////////////////////////
#include"stdafx.h"
#include"windows.h"
#include"CAes.h"
#include
#pragmacomment(lib,"CAes.lib")
3.BOOLisEndOfFile(FILE*fp);
4.voidmain(intargc,char*argv[])
{CCAesCaesObj(128);
intblockLen=CaesObj.BlockByteLen;
intkeyLen=CaesObj.KeyByteLen;
BYTEiv[4][4]={0,1,0,0,//CBC模式的初始向量,长度是加密块长,可以任意设定0,0,2,0,
0,0,0,6,
0,0,0,0};
LPBYTEstate=newBYTE[blockLen];
LPBYTEmidState=new
BYTE[blockLen];
LPBYTEtemp;
LPBYTEp_iv=*iv;
BYTEw1[16]={"AES-CRYPTION"};
charuserKey[100];intcount;inti;FILE*fpr,*fpw;
charfilename1[20],filename2[20],c;
printf("Youwanttoencryptordecryptafile[e/d]");
scanf("%c",&c);
5.if(c=='e'||c=='E')//加密文件过程
{printf(">-----------------------------------------------\nPleaseinputfilenameyouwanttoencrypt:\n");
scanf("%s",filename1);
if((fpr=fopen(filename1,"rb"))==NULL)
{printf("Sorry!Cannotopenthisfile\n");return;}if((fpw=fopen(strcat(filename1,".aes"),"wb+"))==NULL){printf("Cannotopenthisfile\n");
return;}printf("Pleaseinputyourkeynomorethan%dchars!\n",keyLen);scanf("%s",userKey);
CaesObj.keyexpansion(userKey);
printf("Encryptionisgoingon,pleasewaiting........\n");
6.fwrite(w1,1,16,fpw);
i=-1;
while(1)
{++i%=3;
if((count=fread(state,1,blockLen,fpr)) 7.if(i==0)CaesObj.blockxor(state,p_iv,blockLen); elseCaesObj.blockxor(state,midState,blockLen); CaesObj.rijndael(state);memcpy(midState,state,blockLen); fwrite(state,1,blockLen,fpw); 8.if(feof(fpr)){fseek(fpw,15,0); fputc((BYTE)count,fpw);break;}} 9.fclose(fpr); fclose(fpw); printf("Encryptionisover,pressanykeytoreturn.\n"); }//加密文件结束 elseif(c=='d'||c=='D')//解密文件过程 {printf("Pleaseinputfilenameyouwanttodecrypt:\n"); printf("Pleaseinputfilenameafterdecryption:\n"); scanf("%s",filename2);if((fpr=fopen(filename1,"rb"))==NULL) {printf("Cannotopenthisfile\n");return;}if((fpw=fopen(filename2,"wb+"))==NULL){printf("Cannotopenthisfile\n"); return;}printf("Pleaseinputyourkeynomorethan%dchars!\n",keyLen); scanf("%s",userKey);CaesObj.keyexpansion(userKey); fread(w1,1,15,fpr);BYTEco;fread(&co,sizeof(BYTE),1,fpr); temp=newBYTE[blockLen];10.i=-1; 11.while(1){++i%=3;fread(state,1,blockLen,fpr); memcpy(midState,temp,blockLen); memcpy(temp,state,blockLen); CaesObj.invrijndael(state); if(i==0)CaesObj.blockxor(state,p_iv,blockLen); 12.if(isEndOfFile(fpr)){fwrite(state,1,co,fpw); break;13.}else{fwrite(state,1,blockLen,fpw); }}delete[]temp;fclose(fpr);fclose(fpw); }//解密文件结束 14.delete[]state;delete[]midState; }//theendofmain() 15.BOOLisEndOfFile(FILE*fp){BOOLres;16.fgetc(fp); res=feof(fp); fseek(fp,-1,1);17.returnres;} 欢迎访问夏冰加密软件技术博客,您的数据安全知识库和加密技术资讯平台。我们致力于提供最新的加密技术动态、深入的行业资讯以及实用的软件使用技巧,帮助您在数字时代中保护好每一比特的数据。