3

1024バイト程度のチャンクで読み取ることができる大きなファイルがあると仮定すると、SalsaまたはChacha 20を使用して各チャンクを暗号化および復号化するにはどうすればよいですか?

また、ラウンド数(8、12、または20)はどこで指定しますか?

これまでのところ、eSTREAMテストパッケージを見てそれを理解することはできませんでした:(

eSTREAMSalsa20ホームページから次のファイルをダウンロードしました。

  • chacha.c
  • ecrypt-config.h
  • ecrypt-machine.h
  • ecrypt-portable.h
  • ecrypt-sync.h

そして、encrypt-sync.hのコメントで、次の順序で関数を呼び出す方法について説明しています。

  • ECRYPT_keysetup();
  • ECRYPT_ivsetup();
  • ECRYPT_encrypt_bytes();

しかし、これを機能させるためのパラメーターとして何を提供するのか、正確にはわかりません...

これがこれまでの私の最善の試みであり、平文の1つの小さな文字列から始めます(私のCは錆びています...私はそれを見ることができませんが、いくつかの基本的な間違いを犯した可能性があります):

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ecrypt-sync.h"

#define CHUNKSIZE 1024

void getRandomBytes(u8 **str, u32 len);
void showData(u8 *data, u8 *header);

int main(int argc, char** argv)
{
    char plaintext[CHUNKSIZE] = "THIS IS A TEST";
    ECRYPT_ctx ctx;
    u8 *key, *IV, *ciphertext, *result;

    /*
    Don't use random values till we get it working with zeroes at least
    getRandomBytes(&key, ECRYPT_MAXKEYSIZE/8);
    getRandomBytes(&IV, ECRYPT_MAXIVSIZE/8);
    */

    key = (u8 *)calloc((size_t)ECRYPT_MAXKEYSIZE/8, sizeof(u8));
    IV = (u8 *)calloc((size_t)ECRYPT_MAXIVSIZE/8, sizeof(u8));

    printf("Encrypting [%s] using random %d bit key and %d bit IV:\n", plaintext, ECRYPT_MAXKEYSIZE, ECRYPT_MAXIVSIZE);

    ECRYPT_init();
    ECRYPT_keysetup(&ctx, key, ECRYPT_MAXKEYSIZE, ECRYPT_MAXIVSIZE);
    ECRYPT_ivsetup(&ctx, IV);

    ciphertext = (u8 *)calloc((size_t)CHUNKSIZE, sizeof(u8));

    ECRYPT_encrypt_bytes(&ctx, plaintext, ciphertext, CHUNKSIZE);

    //showData(ciphertext, "CIPHERTEXT");

    result = (u8 *)calloc((size_t)CHUNKSIZE, sizeof(u8));

    ECRYPT_decrypt_bytes(&ctx, ciphertext, result, CHUNKSIZE);
    printf("And now decrypting back: [%s]\n", result);

    return 0;
}

void showData(u8 *data, u8 *header) {
    printf("\n-----BEGIN %s-----\n%s\n-----END %s-----\n", header, data, header);

}

void getRandomBytes(u8 **str, u32 len) {
    int fd = open("/dev/random", O_RDONLY);
    char *ptr = malloc((size_t) + 1);

    read(fd, ptr, len);
    close(fd);

    ptr[len] = '\0';
    *str = ptr; 
}

結果は次のようになります。

ランダムな256ビットキーと64ビットIVを使用した暗号化[これはテストです]:そして今度は復号化して戻します:[(ランダムな文字の束)]

あるべき場所:

そして今、復号化しています:[これはテストです]

CまたはC++のいずれかでソリューションを提供してください

ありがとうございました!

4

1 に答える 1

4

実際のコードでSalsa20を使用する予定で、このような質問をする場合は、使いやすいC++ラッパーを備えたNaClライブラリを使用することをお勧めします。

NaClのWebサイトを参照してください。

実際の質問に答えるには、復号化操作のためにIVを再度設定する必要があります。IVは、ナンスとブロックオフセットで構成されます。暗号化/復号化機能はオフセットをインクリメントし、暗号化および復号化機能に異なるIVをコードに与えます。

于 2012-06-25T06:14:45.713 に答える