C中的Android AES

use*_*565 5 c android aes

我想在PC上加密我的文件(Windows 7,64bit)并在Android上解密它们.

我使用这个算法来加密文件.
http://gladman.plushost.co.uk/oldsite/AES/aes-byte-29-08-08.zip

我在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() */
Run Code Online (Sandbox Code Playgroud)

我知道差异发生在aes.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() */
Run Code Online (Sandbox Code Playgroud)

但为什么?!

急需帮助!

Paŭ*_*ann 2

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

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

然后,确保您正在使用

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

  • 加密和解密使用相同的密钥。