Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Android-AES_Android_C_Aes - Fatal编程技术网

C语言中的Android-AES

C语言中的Android-AES,android,c,aes,Android,C,Aes,我想在PC(Windows7,64位)上加密我的文件,然后在Android上解密。 我使用此算法加密文件。 我在PC上加密文件,并将其推送到SD卡。 不幸的是,当我试图在Android上解密它们时, 结果不同, 文件完全无法读取 我的代码怎么了? jbyteArray Java_com_example_hellojni_HelloJni_decrypt(JNIEnv* env, jobject thiz, jstring fileName) { ...... /* re

我想在PC(Windows7,64位)上加密我的文件,然后在Android上解密。

我使用此算法加密文件。


我在PC上加密文件,并将其推送到SD卡。
不幸的是,当我试图在Android上解密它们时,
结果不同,
文件完全无法读取

我的代码怎么了?

jbyteArray Java_com_example_hellojni_HelloJni_decrypt(JNIEnv* env, jobject thiz, jstring fileName) {
    ......

    /* read the file into the buffer */
    size_t result = fread (buffer_in, 1, file_size, fin);
    if (result!=file_size) { fputs("Reading error", stderr); exit(3); } /* end if */
    fclose(fin);

    /* decrypt file */
    aes_context ctx[1];
    aes_set_key(key, 16, ctx);
    long i;
    for (i=0; i<num_block; i++) {
        long begin = i*16;
        char *block = copyBlock(buffer_in, file_size, begin, 16), /* copy buffer_in[begin] ~ buffer_in[begin+16-1] to block[] */
             *tmp = (char*)malloc(sizeof(char)*16);
        aes_decrypt(block, tmp, ctx);
        fillBuffer(buffer_out, out_size, tmp, begin, 16); /* copy tmp[] to buffer_out[begin] ~ buffer_out[begin+16-1] */
        free(tmp);
        free(block);
    } /* end for */
    ......
} /* end Java_com_example_hellojni_HelloJni_decrypt() */
jbyteArray Java_com_示例_hellojni_hellojni_decrypt(JNIEnv*env,jobject thiz,jstring文件名){
......
/*将文件读入缓冲区*/
大小\u t结果=fread(缓冲区\u in,1,文件大小,fin);
如果(结果!=文件大小){fputs(“读取错误”,stderr);退出(3);}/*如果结束*/
财务总监(财务);
/*解密文件*/
aes_上下文ctx[1];
aes设置键(键,16,ctx);
龙我;
对于(i=0;iksch[cc-4];
t1=ctx->ksch[cc-3];
t2=ctx->ksch[cc-2];
t3=ctx->ksch[cc-1];
.......
}/*结束*/
返回0;
}/*结束aes_设置_键()*/
但是为什么?!


迫切需要帮助!

一般来说,您不应该尝试自己实现AES(或任何其他加密算法)(了解其工作原理的其他方法)-将已知库用于生产目的

对于Java(您在这里使用的是JNI,不是吗?),请使用JRE附带的加密API(javax.crypto)。 同样的API也适用于Android(引擎附带的API或BouncyCastle变体)

然后,确保您正在使用

  • 分组密码的操作模式相同(例如ECB(不推荐)、CBC、CTR、CFB、OFB)。 我不知道你的C实现使用哪种模式,也许是ECB。我想Android的默认模式是CBC

  • 用于加密和解密的相同密钥


我还将buffer\u in和buffer\u out更改为“unsigned char*”,但仍然无法工作…字符串略有不同或原始含义完全丢失?字符串相同;文件不可读…我猜Android和PC的uint_8t之间存在差异。您可以在pastebin上上载一些示例吗?提示:提供纯Java加密实现,可用于比较结果本机解密代码比成熟的加密引擎快。Java的AES速度太慢,这就是我使用上述算法的原因。但是如果我在PC上加密文件并在Android上解密,或者反过来,解密的文件就不可读了……而且你的C实现快得多?我真的怀疑这一点。无论如何,如果你你必须这样做。(实际上,看看操作模式。)
return_type aes_set_key( const unsigned char key[], length_type keylen, aes_context ctx[1] ) {
    ......
    for( cc = keylen, rc = 1; cc < hi; cc += 4 ) {
        uint_8t tt, t0, t1, t2, t3;

        /* difference begins here */
        t0 = ctx->ksch[cc - 4];
        t1 = ctx->ksch[cc - 3];
        t2 = ctx->ksch[cc - 2];
        t3 = ctx->ksch[cc - 1];         
        .......
    } /* end for */
    return 0;
} /* end aes_set_key() */