解読と暗号化コード(以下に含まれます)が間違っている可能性があります。彼らはエラーを無料でコンパイルしていますが、復号化されたファイルは平文ファイルと同じではありません。それは歪んだ。(C言語)AES-CTRベースの暗号化解読ツールの文字化け解読
なぜそれが文字化けしているかを調べようとしています。私のコードはうまくいくとは思わない。
私は多分問題を解決できるかもしれないものの束をしましたが、うまくいきませんでした。私はAES-CTRを使用する具体的な方法を持っています。つまり、私はOpenSSLを直接含めません。ランダム性(IVなど)は/dev/urandom/dev/randomに依存しています。 、私は渡すと、特定の検証のためにチェックしています何の引数:(通常は不要である、*(ptr)
代わりのptr[]
およびいくつかの他の同等の代替品を使用してのような)
物事のこれらの束は、私は私の暗号化に対処し、機能を復号化しています方法を含んでいます最後に暗号化または復号化されたテキストを保存する。
私は初期化されたIVを増分(または変更)していません。 IVは16バイトです。それはセキュリティであるとして
size_t blocksize = CCA_STRENGTH; /* CCA_STRENGTH is "#define CCA_STRENGTH 16" */
char *iv = (char *) malloc(16 * sizeof(char));
ri(); /* PRNG initialized.*/
prng_getbytes(iv, blocksize);
*
*
*
*
size_t iv_counter = 0;
while loop starts here...
*
*
*(iv +(block_size - 1)) += iv_counter;
*
*
while loop ends here...
暗号化と復号化が起こっている。このwhileループは、この部分を一時的に削除されます(下の存在である:
以前、私はIVの最後のバイトをインクリメントするためにこれをやっていました要件であり、コーディング標準ではない、または暗号化または復号化機能の要件ではない)。
#include "pv.h"
void encrypt_file (const char *ctxt_fname, void *raw_sk, size_t raw_len, int fin)
{
size_t block_size = CCA_STRENGTH;
int fd; /* ctxt fd */
if((fd = open(ctxt_fname,O_WRONLY|O_TRUNC|O_CREAT,0600)) < 0)
{
perror("Ciphertext file permission error\n");
exit(EXIT_FAILURE);
}
char *iv;
iv = (char *) malloc(block_size * sizeof(char));
ri(); /*IV initialized*/
prng_getbytes(iv, block_size);
struct aes_ctx aes;
const char *aes_key = aes_key = (const char *) raw_sk;
aes_setkey(&aes, aes_key, block_size); /*sets the encryption key.*/
char *buf = buf = (char *) malloc(block_size * sizeof(char)); /*file read buffer*/
char *ctxt = ctxt = (char *) malloc(block_size * sizeof(char)); /*ciphertext buffer*/
int result;
size_t looper = 0;
size_t bytes_read;
result = write_chunk(fd, iv, block_size);
if(result == -1)
{
exit(-1);
}
bytes_read = read(fin, buf, block_size); /*returns how many bytes read*/
while(bytes_read >= 1)
{
aes_encrypt(&aes, ctxt, iv);
for(looper = 0; looper < bytes_read; looper++)
{
*(ctxt + looper) = *(ctxt + looper)^*(buf + looper);
}
result = write_chunk(fd, ctxt, bytes_read);
if(result == -1)
{
perror("Problem when writing to ctxt file... \n");
close(fd);
unlink(ctxt_fname); /*for file deletion*/
aes_clrkey(&aes);
free(ctxt);
free(iv);
free(buf);
exit(EXIT_FAILURE);
}
printf("crossed written to file\n");
if((bytes_read = read(fin, buf, block_size)) < 1)
{
close(fd);
aes_clrkey(&aes);
free(ctxt);
free(iv);
free(buf);
break;
}
}
}
void usage (const char *pname)
{
printf ("Personal Vault: Encryption \n");
printf ("Usage: %s SK-FILE PTEXT-FILE CTEXT-FILE\n", pname);
printf (" Exits if either SK-FILE or PTEXT-FILE don't exist.\n");
printf (" Otherwise, encrpyts the content of PTEXT-FILE under\n");
printf (" sk, and place the resulting ciphertext in CTEXT-FILE.\n");
printf (" If CTEXT-FILE existed, any previous content is lost.\n");
exit (1);
}
int main (int argc, char **argv)
{
int fdsk, fdptxt;
char *raw_sk;
size_t raw_len;
if (argc != 4)
{
usage (argv[0]);
}
else if (((fdsk = open (argv[1], O_RDONLY)) == -1) || ((fdptxt = open (argv[2], O_RDONLY)) == -1))
{
if (errno == ENOENT)
{
usage (argv[0]);
}
else
{
perror (argv[0]);
exit (-1);
}
}
else
{
setprogname (argv[0]);
if (!(import_sk_from_file (&raw_sk, &raw_len, fdsk)))
{
printf ("%s: no symmetric key found in %s\n", argv[0], argv[1]);
close (fdsk);
exit (2);
}
close (fdsk);
bzero(raw_sk, raw_len);
free(raw_sk);
close (fdptxt);
}
return 0;
}
暗号化コードは(最初の暗号文ファイルにIVの16バイトを付加されます。ここでは
#include "pv.h"
void decrypt_file (const char *ptxt_fname, void *raw_sk, size_t raw_len, int fin)
{
int fd;
if((fd = open(ptxt_fname, O_RDWR | O_CREAT | O_EXCL, 0600)) < 0)
{
/*fd will become -1 on failure.*/
perror("plaintext file permission error\n");
exit(EXIT_FAILURE);
}
size_t block_size = CCA_STRENGTH;
const char *aes_key;
aes_key = (const char *) raw_sk;
aes_ctx aes;
aes_setkey(&aes, aes_key, block_size);
char *iv;
iv = (char *) malloc(block_size * sizeof(char));
size_t bytes_read;
bytes_read = read(fin, iv, block_size);
char *buf = (char *) malloc(block_size * sizeof(char)); /*ctxt-file read buffer*/
char *ptxt = (char *) malloc(block_size * sizeof(char)); /*p-text buffer*/
memset(ptxt, 0, block_size);
bytes_read = read(fin, buf, block_size);
while(bytes_read >= 1)
{
aes_encrypt(&aes, ptxt, iv); /* earlier it was "aes_decrypt(&aes, ptxt, iv);" which was not the correct reverse transformation function */
for(loop_variable = 0; loop_variable < bytes_read; loop_variable++)
{
*(ptxt + loop_variable) = *(ptxt + loop_variable)^*(buf + loop_variable);
}
if((result = write_chunk(fd, ptxt, bytes_read)) == -1)
{
perror("Problem when writing to ptxt file... \n");
close(fd);
unlink(ptxt_fname); /*for file deletion*/
aes_clrkey(&aes);
free(ptxt);
free(iv);
free(buf);
exit(EXIT_FAILURE);
}
if((bytes_read = read(fin, buf, block_size)) < 1)
{
close(fd);
aes_clrkey(&aes);
free(ptxt);
free(iv);
free(buf);
break;
}
}
}
void
usage (const char *pname)
{
printf ("Simple File Decryption Utility\n");
printf ("Usage: %s SK-FILE CTEXT-FILE PTEXT-FILE\n", pname);
printf (" Exits if either SK-FILE or CTEXT-FILE don't exist, or\n");
printf (" if a symmetric key sk cannot be found in SK-FILE.\n");
printf (" Otherwise, tries to use sk to decrypt the content of\n");
printf (" CTEXT-FILE: upon success, places the resulting plaintext\n");
printf (" in PTEXT-FILE; if a decryption problem is encountered\n");
printf (" after the processing started, PTEXT-FILE is truncated\n");
printf (" to zero-length and its previous content is lost.\n");
exit (1);
}
int main (int argc, char **argv)
{
int fdsk, fdctxt;
char *sk = NULL;
size_t sk_len = 0;
if (argc != 4) {
usage (argv[0]);
}
else if (((fdsk = open (argv[1], O_RDONLY)) == -1)
|| ((fdctxt = open (argv[2], O_RDONLY)) == -1)) {
if (errno == ENOENT) {
usage (argv[0]);
}
else {
perror (argv[0]);
exit (-1);
}
}
else {
setprogname (argv[0]);
if (!(sk = import_sk_from_file (&sk, &sk_len, fdsk))) {
printf ("%s: no symmetric key found in %s\n", argv[0], argv[1]);
close (fdsk);
exit (2);
}
close (fdsk);
decrypt_file (argv[3], sk, sk_len, fdctxt);
bzero(sk, sk_len);
free(sk);
close (fdctxt);
}
return 0;
}
私暗号コードです:ここでは
は私コードを解読があります私は推測する必要があります;私たちはこれらの16バイトをctxtファイルから解読プロセスで読み込みます)、実際の暗号化が起こります(ブラックボックスと見なします)。ここで私たちはIVと鍵を送る。 16バイトが戻されます。返される16バイトは、平文ファイルバッファとXORされなければなりません(ファイルが16バイトを超える場合は、各ラウンドに対して最大16バイト)。
投稿すると、XORされたバイト(最大16バイト)がファイルに書き込まれます。このことは最後のラウンドまで発生し、最終的には、それ以上読むべき内容をもたないファイルを読み込もうとするとループが壊れる。 read関数は、すべての呼び出しで、次に使用可能なバイト(指定されたバイト数まで)を読み込もうとします。
私はセキュリティの面を緩和している(各サイクルごとにIVをランダム化している)ので、これは完璧な実装ではありませんが、最初はこのように動作する必要があります。
数学的には、私は何をしようとしていますが、この概念の正確なレプリカでなければなりません。ここで
ciphertext_block = message_block^[AES(IV, Key)]
message_block = ciphertext_block^[AES(IV, Key)]
、暗号文/ message_blockは文字のブロックを指し、これは1からn-1ラウンドでは16バイトですが、最後のラウンドでは16バイトになります。
いずれにしても、XORは16バイト文字(AES-CTRの出力)と別のブロック(暗号化の場合はメッセージブロック、復号化の場合は暗号文ブロック、いずれの場合も16バイトまで可能です。 XOR制約、すなわち、それらはXOR出力の長さの決定子になります)。
排他的論理和演算がその長さをカバーするとすぐに、排他的論理和ループが停止し、ファイル(暗号化の場合はctxtファイル、解読の場合はptxtファイル)に書き込むように進みます。
パディングの必要はありません。
realloc
の機能をどこでも使用する必要があるかどうかはわかりません。
私がしようとしていることを理解する際に読者が問題に直面した場合、私は喜んで追加の文書を提供します。
プログラムにはいくつかのライブラリ依存関係がありますが、コードはエラーなしでコンパイルされます。
これは私のコンパイルコマンドです:
gcc -g -O2 -ansi -Wall -Wsign-compare -Wchar-subscripts -Werror -I. -I/usr/include/ -I/home/devel/libdcrypt/include/ -c pv_keygen.c pv_misc.c
gcc -g -O2 -ansi -Wall -Wsign-compare -Wchar-subscripts -Werror -o pv_keygen pv_keygen.o pv_misc.o -L. -L/usr/lib/ -L/home/devel/libdcrypt/lib/ -ldcrypt -lgmp
これはちょうど私の暗号化ファイルのコンパイルのためです。私のkeygenとdecryptファイルには、ほぼ同等の(そして厳密な)コマンドがあります。 Keygenのコードはうまく動作しているようです(私はまだこれをここに含めていません)。キーを生成してファイルにシリアライズすることができます。そのキーファイルは実際には2つのキーを保持しています。私はAES-CTRの最初の半分しか読んでいません。次の半分はMACingの目的のためのものです(AES-CBCを使用)。 xバイト
暗号文ファイル:サイズの詳細
平文ファイル
ファイルxバイト
統計は、コンテンツ権利は、(X + 16)は
解読テキストファイルをバイトそうではありません。解読されたテキストファイルと平文ファイルは同じでなければならない。
私は試しています:diff plaintext_file decrypted_fileファイル比較のためのRedHat。
キーファイルは実際には32バイトで、最初の16バイトは暗号化に使用され、後の16バイトはMACポスト暗号化に使用されます。
キーファイル(シリアル化され、ベース64に)(16進数):
0000000 4662 6e4b 6631 7268 4876 676c 772f 664e
0000010 4d5a 6f32 384e 5141 7139 6635 3442 7245
0000020 646c 4a77 5553 4c30 4f63 3d6f 000a
000002d
入力平文ファイル(16進数):
0000000 6161 6161 6161 6161 6161 6161 610a 6161
0000010 000a
0000011
暗号化ファイル(16進数):
0000000 540e 0e30 d74d 5000 78c1 13e3 0476 d4a2
0000010 61c9 76ac e717 cd6d 013e e872 8e16 4827
0000020 00a2
0000021
復号化ファイル(16進数):
0000000 8bea 616a 1f1b d6b0 fd13 da46 5824 ec00
0000010 0081
0000011
外部参照(私はエラーが存在することができる場所に物事をトリムダウンしている):
1)http://www.scs.stanford.edu/nyu/05sp/lab/lab1.html
2)http://www.scs.stanford.edu/nyu/05sp/lab/install-libs.html
サイド:「ダンボールと目隠しは一見単純な作業でもめったに動作せず、暗号化のようなことはほとんどありません。結果はやや自己預言的であった。 – WhozCraig
@WhozCraigランダム性は助けにならないでしょう。私を熱望させてください。それらはそれを機能させるための試みではなく、思慮深い試みでした。何かがひどく間違っているように見えています(暗号化および/または復号化のみ)。私が楽しみにしているものが浮上しています。 – Avineshwar
これは* review *や* debug *の方がやや複雑です。転記する前に、まずアプリケーションを作成することを確認してください。したがって、暗号化コードからファイル処理を取り除き、その周りに単体テストを書いてください。たとえば、次のような複雑さを試してみることをお勧めします。 IVを作成する必要がありますが、これをさらに進めていく必要があります。 –