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

此处我们使用的是AES的基础加密模式,即:电码本模式ECBJAVA代码如下://创建AES加密实例SecretKeySpecskeySpec=newSecretKeySpec(keyBytes,&qu

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

江江江江于 2026-10-12 13:33:35 修改阅读 4846评论 0点赞 0