【C/C++】JAVA与C/C++ AES加密算法同步
此处我们使用的是AES的基础加密模式,即:电码本模式ECBJAVA代码如下://创建AES加密实例SecretKeySpecskeySpec=newSecretKeySpec(keyBytes,&qu
on
2017/04/12此处我们使用的是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库,不知道如何编译使用,请看我的上一篇文章。
