我想在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)
但为什么?!
急需帮助!
一般来说,您不应该尝试自己实现 AES(或任何其他加密算法)(其他是为了了解它的工作原理)——使用已知的库用于生产目的。
对于 Java(您在这里使用的是 JNI,不是吗?),请使用 JRE 附带的加密 API (javax.crypto)。相同的 API 也可用于 Android(无论是引擎附带的 API,还是 BouncyCastle 变体)。
然后,确保您正在使用
分组密码的操作模式相同(例如ECB(不推荐)、CBC、CTR、CFB、OFB)。我不知道你的 C 实现是哪种模式,也许是 ECB。我想 Android 的默认设置是 CBC。
加密和解密使用相同的密钥。