- 浏览: 631005 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
d1438138:
[img][/img]
google api 的一些神奇使用 -
waykingeye:
[i][b][u]引用[list]
[*][img][url] ...
No result defined for action and result input -
tss0823:
...
No result defined for action and result input -
yahier:
有什么办法能够捕捉,然后给出自定义的提示呢
No result defined for action and result input -
chen_lian:
恩恩 按照上面的代码测试一下觉得很对
java创建目录
因为课程需要,我们要做一个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,还有个测试打包的,大家都可以拿去看看
- AESCipher_test.rar (225.1 KB)
- 下载次数: 68
- AES.rar (5.6 MB)
- 下载次数: 88
发表评论
-
<找工作 九> 字符串全排列问题
2012-09-23 22:01 1386public class StringTest { ... -
<找工作 七>leetcode Add Two Numbers
2012-09-13 22:24 3141Add Two Numbers 链表相加 p ... -
<找工作 六>leetcode Median of Two Sorted Arrays
2012-09-13 21:25 3248http://www.leetcode.com/onlinej ... -
<找工作 八>整数分解为连续整数相加
2012-09-13 17:14 1550整数分解为连续整数相加,最长列表 def ... -
<找工作 五> 子数组之和最大值
2012-09-13 16:22 1202实现了两种,一种是算出最大值,一种是把最大值的子数组打印出来, ... -
<找工作 四>取n个数中最大的k个数
2012-09-12 17:15 1998#! /usr/bin/env python #coding ... -
<找工作 三>统计1到N中1出现的个数
2012-09-12 15:48 1223#include <iostream> u ... -
<找工作二> 单个变量象棋老帅问题
2012-09-10 13:04 1033#include <iostream> ... -
<找工作一>CPU使用率像sin一样
2012-09-10 12:50 1404#include <iostream> # ... -
zz-大规模数据笔试题一般解题思路
2010-10-02 19:16 0最近有点忙,稍微空闲 ...
相关推荐
终于找到了一个能在J2ME 上面用的了 J2me AES 加密解密 crypto-aes
这个"**crypto-js.zip**"压缩包中包含了针对Egret的AES加密解密库,并且带有.d.ts文件,这意味着开发者可以无缝地将这个库集成到Egret项目中,享受类型检查的便利。 **AES加密工作原理:** AES加密的过程主要分为...
在Android平台上,我们可以使用Java的`javax.crypto`包来实现AES加密解密。首先,创建一个`SecretKeySpec`对象来存储密钥,然后创建一个`Cipher`对象,指定加密算法和工作模式。接下来,使用`Cipher`对象的`init`...
在uni-app中,可以使用JavaScript的crypto-js库来实现AES加密解密。首先,你需要通过HBuilderX引入该库,然后在uni-app代码中使用: ```javascript const CryptoJS = require('crypto-js'); const key = 'your_...
本压缩包"uniapp 前后端AES加密解密.rar"正是为了解决这一问题,它包含了在uniapp环境下实现前后端AES加密解密的方法。AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,具有...
在JAVA中实现AES加密解密,需要理解其工作原理、流程以及相关API的使用。以下是对AES加密解密算法及其JAVA实现的详细讲解。 1. AES算法简介: AES是一种块密码,它将明文数据分成128位的块进行加密。它有三种不同的...
在Java中实现AES加密解密,可以使用Java Cryptography Extension (JCE) 提供的`javax.crypto.Cipher`类。首先,需要创建一个密钥,这可以通过`KeyGenerator`类完成。然后,初始化`Cipher`对象,设置为加密或解密模式...
要实现AES加密,我们需要引入第三方库crypto-js。crypto-js提供了各种加密算法,包括AES。在jQuery中,可以如下使用crypto-js进行AES加密: ```javascript var key = CryptoJS.lib.WordArray.random(16); // 生成...
在C语言中实现AES加密解密是一项基础且重要的技能,特别是在嵌入式系统和低级别编程中。 AES的核心是一个名为Rijndael的密码,由比利时密码学家Joan Daemen和Vincent Rijmen设计。它的工作原理基于一系列的替换和...
在STM32上实现AES加密解密,通常需要利用其内部的加密硬件模块,如CryptoCell或DMA控制器,以提高性能和效率。STM32的HAL库或LL库提供了相应的API接口,用于配置和操作这些硬件资源。然而,对于没有内置加密硬件的...
### 知识点详解 #### 一、AES加密算法简介 **高级加密标准(Advanced Encryption Standard,AES)**是一种对称加密算法...通过以上介绍,我们可以了解到如何在Java中实现AES加密解密的基本流程,以及相关的注意事项。
对于Java,虽然有内置的javax.crypto.Cipher类可以方便地实现AES加密解密,但我们同样需要避免使用这个库,而是通过Java的基础类型如String和byte[]来实现。这可能需要我们理解并手动实现Java的内存管理,因为字符串...
标题中的"C++/java/C#语言的AES加密解密"涉及到的是三种常用编程语言——C++、Java和C#在实现AES(Advanced Encryption Standard,高级加密标准)算法上的应用。AES是一种广泛使用的对称加密算法,它在信息安全领域...
本文将详细探讨如何使用JavaScript(JS)在HTML前端实现AES加密解密,并着重讲解AES的CBC模式及其填充方式。 AES,全称为Advanced Encryption Standard,即高级加密标准,是一种广泛应用于网络安全的对称加密算法。...
在C++中实现AES加密解密,通常会用到如Crypto++、OpenSSL等开源库,这些库提供了丰富的加密函数和API,使得开发者能够方便地集成AES功能。DLL的使用使得这个加密解密服务可以作为一个独立的模块,供其他应用程序调用...
总之,不依赖cryptoJs的AES加密解密是通过自定义的JavaScript代码完成的,涉及的关键步骤包括密钥扩展、填充、字节到状态的转换、加密/解密过程以及Base64编码/解码。如果你需要在项目中实现这种功能,你需要深入...
总的来说,这个资源为Delphi开发者提供了一种实现AES加密解密的方式,并且保证了与Java平台的兼容性。通过理解和应用这些代码,开发者可以增强他们的应用程序在数据安全方面的性能,同时也能更好地与其他Java应用...
Android 平台提供了 javax.crypto 包,包含了 AES 加密算法的实现。 生成 AES 密钥 在使用 AES 加密之前,需要生成 AES 密钥。AES 密钥可以使用 KeyGenerator 类生成,代码如下: ```java KeyGenerator keygen = ...