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



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值