c 和java aes加密 同步_【C/C++】JAVA与C/C++ AES加密算法同步

此处我们使用的是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库,不知道如何编译使用,请看我的上一篇文章。

你可能感兴趣的:(c,和java,aes加密,同步)