Fix KDH decryption.
Signed-off-by: yzrh <yzrh@noema.org>
This commit is contained in:
parent
4a02b8bfc7
commit
e0fe937e1a
1 changed files with 19 additions and 17 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2020-2021, yzrh <yzrh@noema.org>
|
||||
* Copyright (c) 2020-2023, yzrh <yzrh@noema.org>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
@ -15,16 +15,18 @@ cnki_kdh(cnki_t **param)
|
|||
if ((*param)->stat > 0)
|
||||
printf("Begin 'KDH' decryption\n");
|
||||
|
||||
long cur = ADDRESS_KDH_BODY;
|
||||
long end;
|
||||
|
||||
fseek((*param)->fp_i, 0, SEEK_END);
|
||||
|
||||
long size = ftell((*param)->fp_i);
|
||||
|
||||
fseek((*param)->fp_i, ADDRESS_KDH_BODY, SEEK_SET);
|
||||
end = ftell((*param)->fp_i);
|
||||
fseek((*param)->fp_i, cur, SEEK_SET);
|
||||
|
||||
const char key[] = KEY_KDH;
|
||||
const int key_len = KEY_KDH_LENGTH;
|
||||
long key_cur = 0;
|
||||
|
||||
int buf_size;
|
||||
char buf[(*param)->size_buf];
|
||||
|
||||
FILE *tmp = tmpfile();
|
||||
|
@ -33,32 +35,32 @@ cnki_kdh(cnki_t **param)
|
|||
return 1;
|
||||
|
||||
for (;;) {
|
||||
fread(buf, (*param)->size_buf, 1, (*param)->fp_i);
|
||||
if (cur + (*param)->size_buf < end)
|
||||
buf_size = (*param)->size_buf;
|
||||
else
|
||||
buf_size = end - cur;
|
||||
|
||||
for (int i = 0; i < (*param)->size_buf; i++) {
|
||||
buf[i] ^= key[key_cur % key_len];
|
||||
key_cur++;
|
||||
}
|
||||
fread(buf, buf_size, 1, (*param)->fp_i);
|
||||
|
||||
fwrite(buf, (*param)->size_buf, 1, tmp);
|
||||
for (int i = 0; i < buf_size; i++)
|
||||
buf[i] ^= key[key_cur++ % key_len];
|
||||
|
||||
if (ftell((*param)->fp_i) == size)
|
||||
fwrite(buf, buf_size, 1, tmp);
|
||||
|
||||
if ((cur = ftell((*param)->fp_i)) >= end)
|
||||
break;
|
||||
}
|
||||
|
||||
if ((*param)->stat > 0)
|
||||
printf("Decrypted %ld byte(s)\n", ftell(tmp));
|
||||
|
||||
fseek(tmp, 0, SEEK_SET);
|
||||
fclose((*param)->fp_i);
|
||||
|
||||
FILE *orig = (*param)->fp_i;
|
||||
fseek(tmp, 0, SEEK_SET);
|
||||
(*param)->fp_i = tmp;
|
||||
|
||||
cnki_pdf(param);
|
||||
|
||||
(*param)->fp_i = orig;
|
||||
fclose(tmp);
|
||||
|
||||
if ((*param)->stat > 0)
|
||||
printf("Conversion ended\n");
|
||||
|
||||
|
|
Loading…
Reference in a new issue