假设我们有一个大文件,可以在1024字节左右的块中读取,如何使用Salsa或Chacha 20加密和解密每个块?
另外,我在哪里指定轮数(即8,12或20)?
到目前为止,我还没有通过查看eSTREAM测试包来解决这个问题:(
下载了以下文件我看到encrypt-sync.h中的注释以这个顺序讨论调用函数:
但我完全不知道我应该提供什么作为参数来使这项工作......
到目前为止,这是我最好的尝试,从一小段明文开始(我的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 ++的解决方案
谢谢!
答案 0 :(得分:4)
如果您打算在实际代码中使用Salsa20并且您提出类似这样的问题,那么您可能希望将NaCl库与友好的C ++包装器一起使用。
请参阅The NaCl website。
要回答您的实际问题:您需要再次设置IV以进行解密操作。 IV由您的随机数和块偏移量组成。加密/解密函数增加偏移量,为加密和解密函数提供不同的IV代码。