【C/C++】JAVA与C/C++ AES加密算法同步

来源:互联网 发布:牛肉干市场调查数据 编辑:程序博客网 时间:2024/04/29 19:32

此处我们使用的是AES的基础加密模式,即:电码本模式 ECB

JAVA代码如下:

//创建AES加密实例SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");  Cipher cip = Cipher.getInstance("AES/ECB/NoPadding");//算法/模式/补码方式cip.init(Cipher.ENCRYPT_MODE,skeySpec);  //分块加密int black= data.length/16+1;byte[] out = new byte[black * 16];int b = 0;while(b < black){//计算偏移int offset = b * 16;//计算剩余长度int len = (data.length-16-offset) > 0 ? 16:(data.length - offset);byte[] input = new byte[16];System.arraycopy(data, offset, input, 0, len);byte[] output=cip.doFinal(input);System.arraycopy(output, 0, out,offset, 16);b++;}return out; 

注意一点,AES的ECB模式加密的过程是分块的,必须我们手动实现分块的过程,在java中记得设置补码方式为NoPadding,不需要补码,否则无法和c++的同步

C/C++代码:

char* Aes(char *key,int *destLen,char *src,int srcLen){mbedtls_aes_context aes_ctx; mbedtls_aes_init( &aes_ctx );  //设置加密密钥  mbedtls_aes_setkey_enc( &aes_ctx,(unsigned char *)key, 128);//获取块的数量int block=srcLen/16+1;//动态分配内存*destLen = block*16;char *dest=new char[*destLen];//清空memset(dest,0,*destLen);//分块加密,每块16字节长度unsigned char input[16];unsigned char outout[16];int b = 0;while( b < block ){int offset = b * 16;int len = 0;if((srcLen-16-offset) > 0 ){len = 16;}else{len = srcLen-offset;}LOG(L"偏移:%d 长度:%d \n",offset,len);memset(input,0,16);memset(outout,0,16);memcpy(input,&src[offset],len);//加密mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, input, outout ); memcpy(&dest[b*16],outout,16);b++;}Print(dest,*destLen);return dest;}

此处我们使用的是mbedtls库,不知道如何编译使用,请看我的上一篇文章。



0 1