`

aes加密解密 crypto实现

阅读更多

   因为课程需要,我们要做一个aes的加密解密的小程序,其中核心部分我选择了crypto,但是这个的api又少又难懂,不过还是勉强写完了,

   其中包括了cbc,ecb两种连接方式的实现,支持128,192,256位密钥,明文长度不限,填充采用的是标准的(pkcs#5标准)如果明文最后一部分不满16个字节,缺4个字节,那么我在最后4个字节将会填入04,04,04,04,所以我的明文最后的数字范围从(1-16),这个特性将会影响我加密出来的最终结果,这时要特别注意的,

  

代码如下

 

#include <iostream>
using namespace std; 
#include <aes.h>
#include <modes.h>
#include <string>
#include <fstream>
using namespace std;
using namespace CryptoPP;
#pragma comment( lib, "cryptlib.lib" )
void AESBasicEncrypt(string input,string key,string output);
void AESBasicDecrypt(string input,string key,string output);
void AESCBCEncrypt(string input,string key,string iv,string output);
void AESCBCDecrypt(string input,string key,string iv,string output);
void  XorCharArray(unsigned char *a,unsigned char * b,int length);
int main(int argc,char *argv[])
{
  if(argc<2){
   cout<< "the parameters has some error"<<endl;
   system("pause");
   return 1;
  }
        //AES中使用的固定参数是以类AES中定义的enum数据类型出现的,而不是成员函数或变量
        //因此需要用::符号来索引
  string aes="AES";
  string ECB="ECB";
  string InvAES="InvAES";
  string CBC="CBC";
  string InvCBC="InvCBC";
  string InvECB="InvECB";
        cout << "AES Parameters: " << endl;
        cout << "Algorithm name : " << AES::StaticAlgorithmName() << endl;      
  cout << "Algorithm Type : " << argv[1] << endl;      
  if((argv[1]==aes||argv[1]==ECB)&&argc>=5){
   cout << "Algorithm InputText : " << argv[2] << endl;      
   cout << "Algorithm InputKey : " << argv[3] << endl;      
   cout << "Algorithm OutputText  : " << argv[4] << endl;  
   cout << "Block size     : " << AES::BLOCKSIZE * 8 << endl;
   AESBasicEncrypt(argv[2],argv[3],argv[4]);
   system("pause");
   return 0;
  }
  if(argv[1]==CBC&&argc>=6){
   cout << "Algorithm InputText : " << argv[2] << endl;      
   cout << "Algorithm InputKey : " << argv[3] << endl;     
   cout << "Algorithm IV : " << argv[4] << endl; 
   cout << "Algorithm OutputText  : " << argv[5] << endl;  
   cout << "Block size     : " << AES::BLOCKSIZE * 8 << endl;
   AESCBCEncrypt(argv[2],argv[3],argv[4],argv[5]);
   system("pause");
   return 0;
  }
  if(argv[1]==InvCBC&&argc>=6){
   cout << "Algorithm InputText : " << argv[2] << endl;      
   cout << "Algorithm InputKey : " << argv[3] << endl;     
   cout << "Algorithm IV : " << argv[4] << endl; 
   cout << "Algorithm OutputText  : " << argv[5] << endl;  
   cout << "Block size     : " << AES::BLOCKSIZE * 8 << endl;
   AESCBCDecrypt(argv[2],argv[3],argv[4],argv[5]);
   system("pause");
   return 0;
  }
  if((argv[1]==InvAES||argv[1]==InvECB)&&argc>=5){
   cout << "Algorithm InputText : " << argv[2] << endl;      
   cout << "Algorithm InputKey : " << argv[3] << endl;      
   cout << "Algorithm OutputText  : " << argv[4] << endl; 
   cout << "Block size     : " << AES::BLOCKSIZE * 8 << endl;
   AESBasicDecrypt(argv[2],argv[3],argv[4]);
   system("pause");
   return 0;
  }    
  cout<< "the parameters has some error"<<endl;
       
        
       
    
  system("pause");
        return 0;
}
void AESBasicEncrypt(string input,string key,string output){
 ifstream inputTextF;
 ifstream inputKeyF;
 ofstream outputF(output.c_str(),ofstream::binary);
 inputTextF.open(input.c_str(),ifstream::binary);
 AESEncryption aesEncryptor;
 char aesKey[32]={0};
 unsigned char aesKey2[32]={0};
 unsigned char aesText2[16]={0};
 char inputT[16]={0}; 
 unsigned char outBlock[AES::BLOCKSIZE]={0};                                
    unsigned char xorBlock[AES::BLOCKSIZE];                                 
    memset( xorBlock, 0, AES::BLOCKSIZE );                                  
 if(!inputTextF){
  cout<< "the "+input+" not found or error"<<endl;
  return ;
 }
 inputKeyF.open(key.c_str(),ifstream::binary); 
 if(!inputKeyF){
 cout<< "the "+key+" not found or error"<<endl;
  return ;
 }
 inputKeyF.read(aesKey,32);
 int  end_pos,endNum=0;   
    end_pos = inputKeyF.gcount(); 
 memcpy(aesKey2,aesKey,end_pos); 


 aesEncryptor.SetKey(aesKey2, end_pos );  
 cout << "key length : " << end_pos * 8 << endl;
     
 cout << "output encryption Text     : " << endl;
 while(!inputTextF.eof())
 { memset( inputT, 0, AES::BLOCKSIZE );
  inputTextF.read(inputT,16);
  endNum=inputTextF.gcount();
  if(endNum<16){
   for(int i=endNum;i<16;i++){
    inputT[i]=16-endNum;
   }
  }
  memcpy(aesText2,inputT,16);
  
  aesEncryptor.ProcessAndXorBlock( aesText2, xorBlock, outBlock );  
  
  for( int i=0; i<16; i++ ) {
   outputF<<outBlock[i];
  
                cout << hex << (int)outBlock[i] << " ";


 }
  outputF.flush();
 }
 inputTextF.close();
  inputTextF.clear();
  inputKeyF.close();
  inputKeyF.clear();
  outputF.close();
  outputF.clear();
 cout << endl;
}
void AESCBCEncrypt(string input,string key,string iv,string output){
 ifstream inputTextF;
 ifstream inputKeyF;
 ifstream ivF;
 ofstream outputF(output.c_str(),ofstream::binary);
 AESEncryption aesEncryptor;
 char aesKey[32]={0};
 unsigned char aesKey2[32]={0};
 char inputT[16]={0};
 unsigned char aesText2[16]={0};  
 unsigned char outBlock[AES::BLOCKSIZE]={0};                                
 char ivArray[16]={0};
 unsigned char ivArrayU[16]={0};
 unsigned char xorBlock[AES::BLOCKSIZE];                                 
    int end_pos=0,endNum=0;
 memset( xorBlock, 0, AES::BLOCKSIZE );                                  
 

 inputKeyF.open(key.c_str(),ifstream::binary); 
 if(!inputKeyF){
  cout<< "the "+key+" not found or error"<<endl;
       
  return ;
 }
 inputKeyF.read(aesKey,32);   
 end_pos = inputKeyF.gcount(); 
 memcpy(aesKey2,aesKey,end_pos); 
 aesEncryptor.SetKey(aesKey2, end_pos );  
 cout << " key length : " << end_pos * 8 << endl;
     
 ivF.open(iv.c_str(),ifstream::binary); 
 if(!ivF){
  cout<< "the "+iv+" not found or error"<<endl;
       
  return ;
 }
 ivF.read(ivArray,16);
 memcpy(ivArrayU,ivArray,16);
 ivF.close();

 inputTextF.open(input.c_str(),ifstream::binary); 
 if(!inputTextF){
  cout<< "the "+input+" not found or error"<<endl;
       
  return ;
 }
 cout << "output encryption Text     : " << endl;
 
 while(!inputTextF.eof())
 { memset( inputT, 0, AES::BLOCKSIZE );
  inputTextF.read(inputT,16);
  endNum=inputTextF.gcount();
  if(endNum<16){
   for(int i=endNum;i<16;i++){
    inputT[i]=16-endNum;
   }
  }
  memcpy(aesText2,inputT,16);
  XorCharArray(aesText2,ivArrayU,16);
  aesEncryptor.ProcessAndXorBlock( aesText2, xorBlock, outBlock );  
  memcpy(ivArrayU,outBlock,16);
  for( int i=0; i<16; i++ ) {
   outputF<<outBlock[i];
  
                cout << hex << (int)outBlock[i] << " ";


 }
  outputF.flush();
 }
 inputTextF.close();
  inputTextF.clear();
  inputKeyF.close();
  inputKeyF.clear();
  outputF.close();
  outputF.clear();
 cout << endl;
}
void AESCBCDecrypt(string input,string key,string iv,string output)
{
 ifstream inputTextF;
 ifstream inputKeyF;
 ifstream ivF;
 ofstream outputF(output.c_str(),ofstream::binary);
 inputTextF.open(input.c_str(),ifstream::binary);
  AESDecryption aesDecryptor;
 char aesKey[32]={0};
 unsigned char aesKey2[32]={0};
 unsigned char aesText2[16]={0};
 char inputT[16]={0}; 
 unsigned char outBlock[AES::BLOCKSIZE]={0};                                
 char ivArray[16]={0};
 unsigned char ivArrayU[16]={0}; 
    unsigned char xorBlock[AES::BLOCKSIZE];                                 
    memset( xorBlock, 0, AES::BLOCKSIZE );                                  
 
       

 if(!inputTextF){
  cout<< "the "+input+" not found or error"<<endl;
  return ;
 }
 inputKeyF.open(key.c_str(),ifstream::binary); 
 if(!inputKeyF){
  cout<< "the "+key+" not found or error"<<endl;
  return ;
 }
 inputKeyF.read(aesKey,32);
 int  end_pos,endNum;   
    end_pos = inputKeyF.gcount(); 
 memcpy(aesKey2,aesKey,end_pos);  

 
 aesDecryptor.SetKey(aesKey2, end_pos );  //设定密钥
 cout << " key length : " << end_pos * 8 << endl;
   
    ivF.open(iv.c_str(),ifstream::binary); 
 if(!ivF){
  cout<< "the "+iv+" not found or error"<<endl;
  return ;
 }
 ivF.read(ivArray,16);
 memcpy(ivArrayU,ivArray,16);
 ivF.close();

 memset( inputT, 0, AES::BLOCKSIZE );


 cout << "output Decryption Text     : " << endl;
 
 while(inputTextF.peek()!=EOF)
 { inputTextF.read(inputT,16);
  endNum=16;
  memcpy(aesText2,inputT,16);  
  aesDecryptor.ProcessAndXorBlock( aesText2, xorBlock, outBlock );  
  XorCharArray(outBlock,ivArrayU,16);
  //memcpy(xorBlock,outBlock,16);
  memcpy(ivArrayU,aesText2,16);
  
  
  if(inputTextF.peek()==EOF){
   endNum=16-outBlock[15];
  }
  for( int i=0; i<endNum; i++ ) {
   outputF<<outBlock[i];
  
                cout << hex << (int)outBlock[i] << " ";


 }
  cout<<endl;
  outputF.flush();
  memset( inputT, 0, AES::BLOCKSIZE );
 }
 inputTextF.close();
  inputTextF.clear();
  inputKeyF.close();
  inputKeyF.clear();
  outputF.close();
  outputF.clear();
 cout << endl;
}
void AESBasicDecrypt(string input,string key,string output)
{
 ifstream inputTextF;
 ifstream inputKeyF;
 ofstream outputF(output.c_str(),ofstream::binary);
 inputTextF.open(input.c_str(),ifstream::binary);
  AESDecryption aesDecryptor;
 char aesKey[32]={0};
 unsigned char aesKey2[32]={0};
 unsigned char aesText2[16]={0};
 char inputT[16]={0}; 
 unsigned char outBlock[AES::BLOCKSIZE]={0};                                
    unsigned char xorBlock[AES::BLOCKSIZE];                                 
    memset( xorBlock, 0, AES::BLOCKSIZE );                                  
 
       

 if(!inputTextF){
  cout<< "the "+input+" not found or error"<<endl;
  return ;
 }
 inputKeyF.open(key.c_str(),ifstream::binary); 
 if(!inputKeyF){
  cout<< "the "+key+" not found or error"<<endl;
  
  return ;
 }
 inputKeyF.read(aesKey,32);
 int  end_pos,endNum;   
    end_pos = inputKeyF.gcount(); 
 memcpy(aesKey2,aesKey,end_pos);  

 
 aesDecryptor.SetKey(aesKey2, end_pos );  //设定加密密钥
 cout << " key length : " << end_pos * 8 << endl;
   
     
 memset( inputT, 0, AES::BLOCKSIZE );
 cout << "output Decryption Text     : " << endl;
 
 while(inputTextF.peek()!=EOF)
 { inputTextF.read(inputT,16);
  endNum=16;
  memcpy(aesText2,inputT,16); 

  aesDecryptor.ProcessAndXorBlock( aesText2, xorBlock, outBlock );  //加密
  if(inputTextF.peek()==EOF){
   endNum=16-outBlock[15];
  }
  for( int i=0; i<endNum; i++ ) {
   outputF<<outBlock[i];
  
                cout << hex << (int)outBlock[i] << " ";


 }
  cout<<endl;
  outputF.flush();
  memset( inputT, 0, AES::BLOCKSIZE );
 }
 inputTextF.close();
  inputTextF.clear();
  inputKeyF.close();
  inputKeyF.clear();
  outputF.close();
  outputF.clear();
 cout << endl;
}
void  XorCharArray(unsigned char *a,unsigned char * b,int length){
 for(int i=0;i<length;i++){
  a[i]=a[i]^b[i];
 }
}

 
 代码质量很低,大家随便看看,此外参考了网上一些例子,用法如下

AESCipher.exe CBC ice.txt   KeyFile.dat iv.dat outputCBC.dat 
AESCipher.exe InvCBC outputCBC.dat    KeyFile.dat iv.dat outputCBCP.dat 
AESCipher.exe AES ice.txt   KeyFile.dat outputAES.dat
AESCipher.exe InvAES outputAES.dat   KeyFile.dat outputAESP.dat
AESCipher.exe ECB ice.txt   KeyFile.dat outputECB.dat
AESCipher.exe InvECB outputECB.dat   KeyFile.dat outputECBP.dat

 

 ice.txt是原文,keyFile.dat是密钥,outputXXX.dat是密文,ouputXXXP.dat是解密后的原文,源代码附件AES.rar里面有,其中的cryptlib是我利用vs2010生成的crpyto的lib,还有个测试打包的,大家都可以拿去看看

  • AES.rar (5.6 MB)
  • 下载次数: 88
分享到:
评论

相关推荐

    J2me AES 加密解密 crypto-aes

    终于找到了一个能在J2ME 上面用的了 J2me AES 加密解密 crypto-aes

    crypto-js.zip,AES加密解密egret库有.d.ts文件

    这个"**crypto-js.zip**"压缩包中包含了针对Egret的AES加密解密库,并且带有.d.ts文件,这意味着开发者可以无缝地将这个库集成到Egret项目中,享受类型检查的便利。 **AES加密工作原理:** AES加密的过程主要分为...

    AES加密解密算法 iOS和Android完美实现

    在Android平台上,我们可以使用Java的`javax.crypto`包来实现AES加密解密。首先,创建一个`SecretKeySpec`对象来存储密钥,然后创建一个`Cipher`对象,指定加密算法和工作模式。接下来,使用`Cipher`对象的`init`...

    php+uni-app AES加密解密.rar

    在uni-app中,可以使用JavaScript的crypto-js库来实现AES加密解密。首先,你需要通过HBuilderX引入该库,然后在uni-app代码中使用: ```javascript const CryptoJS = require('crypto-js'); const key = 'your_...

    uniapp 前后端AES加密解密.rar

    本压缩包"uniapp 前后端AES加密解密.rar"正是为了解决这一问题,它包含了在uniapp环境下实现前后端AES加密解密的方法。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,具有...

    AES加密解密JAVA实现

    在JAVA中实现AES加密解密,需要理解其工作原理、流程以及相关API的使用。以下是对AES加密解密算法及其JAVA实现的详细讲解。 1. AES算法简介: AES是一种块密码,它将明文数据分成128位的块进行加密。它有三种不同的...

    AES加密解密算法的实现

    在Java中实现AES加密解密,可以使用Java Cryptography Extension (JCE) 提供的`javax.crypto.Cipher`类。首先,需要创建一个密钥,这可以通过`KeyGenerator`类完成。然后,初始化`Cipher`对象,设置为加密或解密模式...

    jquery实现aes加密,后端php解密

    要实现AES加密,我们需要引入第三方库crypto-js。crypto-js提供了各种加密算法,包括AES。在jQuery中,可以如下使用crypto-js进行AES加密: ```javascript var key = CryptoJS.lib.WordArray.random(16); // 生成...

    C语言实现AES加密解密

    在C语言中实现AES加密解密是一项基础且重要的技能,特别是在嵌入式系统和低级别编程中。 AES的核心是一个名为Rijndael的密码,由比利时密码学家Joan Daemen和Vincent Rijmen设计。它的工作原理基于一系列的替换和...

    C语言 stm32 AES加密解密

    在STM32上实现AES加密解密,通常需要利用其内部的加密硬件模块,如CryptoCell或DMA控制器,以提高性能和效率。STM32的HAL库或LL库提供了相应的API接口,用于配置和操作这些硬件资源。然而,对于没有内置加密硬件的...

    AES加密解密JAVA实现(带源码)

    ### 知识点详解 #### 一、AES加密算法简介 **高级加密标准(Advanced Encryption Standard,AES)**是一种对称加密算法...通过以上介绍,我们可以了解到如何在Java中实现AES加密解密的基本流程,以及相关的注意事项。

    c/c++与java互通 AES加密解密

    对于Java,虽然有内置的javax.crypto.Cipher类可以方便地实现AES加密解密,但我们同样需要避免使用这个库,而是通过Java的基础类型如String和byte[]来实现。这可能需要我们理解并手动实现Java的内存管理,因为字符串...

    C++/java/C#语言的AES加密解密

    标题中的"C++/java/C#语言的AES加密解密"涉及到的是三种常用编程语言——C++、Java和C#在实现AES(Advanced Encryption Standard,高级加密标准)算法上的应用。AES是一种广泛使用的对称加密算法,它在信息安全领域...

    AES加密解密 JS html 前端

    本文将详细探讨如何使用JavaScript(JS)在HTML前端实现AES加密解密,并着重讲解AES的CBC模式及其填充方式。 AES,全称为Advanced Encryption Standard,即高级加密标准,是一种广泛应用于网络安全的对称加密算法。...

    vs2008C++实现AES加密解密算法

    在C++中实现AES加密解密,通常会用到如Crypto++、OpenSSL等开源库,这些库提供了丰富的加密函数和API,使得开发者能够方便地集成AES功能。DLL的使用使得这个加密解密服务可以作为一个独立的模块,供其他应用程序调用...

    不用cryptoJs的aes加密解密

    总之,不依赖cryptoJs的AES加密解密是通过自定义的JavaScript代码完成的,涉及的关键步骤包括密钥扩展、填充、字节到状态的转换、加密/解密过程以及Base64编码/解码。如果你需要在项目中实现这种功能,你需要深入...

    Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes

    总的来说,这个资源为Delphi开发者提供了一种实现AES加密解密的方式,并且保证了与Java平台的兼容性。通过理解和应用这些代码,开发者可以增强他们的应用程序在数据安全方面的性能,同时也能更好地与其他Java应用...

    android使用AES加密和解密文件实例代码

    Android 平台提供了 javax.crypto 包,包含了 AES 加密算法的实现。 生成 AES 密钥 在使用 AES 加密之前,需要生成 AES 密钥。AES 密钥可以使用 KeyGenerator 类生成,代码如下: ```java KeyGenerator keygen = ...

Global site tag (gtag.js) - Google Analytics