gpt4 book ai didi

c++ - 如何使用 salsa20(或 ChaCha)?

转载 作者:太空狗 更新时间:2023-10-29 21:04:44 25 4
gpt4 key购买 nike

假设我们有一个可以以 1024 字节左右的 block 读取的大文件,我如何使用 Salsa 或 Chacha 20 加密和解密每个 block ?

另外,我应该在哪里指定回合数(即 8、12 或 20)?

到目前为止,我一直无法通过查看eSTREAM测试包来弄清楚:(

我通过 eSTREAM 下载了以下文件和 Salsa20 homepage :

  • chacha.c
  • 密码配置.h
  • 密码机.h
  • ecrypt-portable.h
  • 加密同步.h

我看到 encrypt-sync.h 中的注释谈到按此顺序调用函数:

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

但我完全不知道我应该提供什么作为参数来使这项工作...

这是我迄今为止最好的尝试,从一小串纯文本开始(我的 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;
}

结果如下:

Encrypting [THIS IS A TEST] using random 256 bit key and 64 bit IV: And now decrypting back: [(bunch of random characters)]

它应该在哪里:

And now decrypting back: [THIS IS A TEST]

请随意用 C 或 C++ 提供您的解决方案

谢谢!

最佳答案

如果您打算在实际代码中使用 Salsa20 并且您会问这样的问题,您可能希望使用带有友好 C++ 包装器的 NaCl 库。

参见 The NaCl website .

要回答您的实际问题:您需要为解密操作再次设置 IV。 IV 由您的随机数和 block 偏移量组成。加密/解密函数增加偏移量,为您的代码提供不同的加密和解密函数 IV。

关于c++ - 如何使用 salsa20(或 ChaCha)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11176998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com