首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用salsa20 (或ChaCha)?

如何使用salsa20 (或ChaCha)?
EN

Stack Overflow用户
提问于 2012-06-24 11:17:37
回答 1查看 7.7K关注 0票数 4

假设我们有一个可以以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();

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

这是我迄今为止最好的尝试,从一小串明文开始(我的C是生锈的.我可能犯了一些基本的错误,虽然我看不见):

代码语言:javascript
复制
#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++提供您的解决方案

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-25 06:14:45

如果您要在实际代码中使用Salsa20,并且提出类似这样的问题,那么您可能希望使用带有友好的C++包装器的NaCl库。

NaCl网站

要回答您的实际问题:您需要再次为解密操作设置IV。IV包括你的现在和一个块偏移。加密/解密函数增加偏移量,为加密和解密函数提供不同的IV。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11176998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档