首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从源AEAD加密文件

从源AEAD加密文件
EN

Code Review用户
提问于 2020-04-15 20:42:57
回答 2查看 91关注 0票数 4

我试图直接使用源代码加密/解密文件。问题是如何在读取文件后正确地完成该操作。

代码语言:javascript
复制
int crypto_aead_encrypt(
    unsigned char *c, unsigned long long *clen,
    const unsigned char *m, unsigned long long mlen,
    const unsigned char *ad, unsigned long long adlen,
    const unsigned char *nsec,
    const unsigned char *npub,
    const unsigned char *k
)

工作代码:(明文为char *)

代码语言:javascript
复制
for (start = 0; start < fileLength; start += 32)
    {
        int end = (start + 32);
        end = end > fileLength ? fileLength : end;

        strncpy(msg, plaintext + start, end - start);

        // encrypt
        crypto_aead_encrypt(ct, &clen, msg, mlen, ad, adlen, NULL, nonce, key);

        // decryption

        crypto_aead_decrypt(msg2, &mlen2, NULL, ct, clen, ad, adlen, nonce, key);
}

这是函数,消息m的最大限制是32位,这将使大文件(例如)的加密/解密时间非常长。1GB)。是否有一种方法可以像从库中一样快速地执行加密。忽略了上面的代码,例如。当提供OpenSSL时,-in是如何实现的?

我的方法是读取文件,将其保存到char *中,然后取32位,并对每个位进行enc。因此,我想知道是否有更正确的方法来做这件事。

编辑:引用实现,如阿斯康光子甲虫

EN

回答 2

Code Review用户

发布于 2020-04-16 02:02:34

我想你在这里很困惑。GCM算法有一个96位的nonce,并用32位计数器填充128位块大小的其余部分。所以你有2^32个完整的街区供你使用,或者说大约64 GiB。那是-呃-略多于32位(好的,计数器从2开始,所以你有48个字节,最好保持在32 GiB或48 GiB)。

票数 2
EN

Code Review用户

发布于 2020-04-17 21:59:17

因此,我想知道是否有更正确的方法来做这件事。

二进制数据

文件的加密不应假定它是缺少'\0'的文本。作为二进制文件,数据可能包含空字符,这些字符将使用strncpy()错误地复制。

代码语言:javascript
复制
// strncpy(msg, plaintext + start, end - start);
memcpy(msg, plaintext + start, end - start);

大文件

“对于大文件(例如1GB)”-> 1GB不是那么大。不要将文件大小限制在int范围内,而是使用size_t。这是典型的,至少是正数范围的2倍,也可能是数十亿倍。考虑到单个数组的使用,代码在设计上仅限于size_t。最好尽可能多地使用范围。

代码语言:javascript
复制
size_t start;
... 
// int end = (start + 32);
size_t end = (start + 32);

更好的代码将像使用unsigned long long签名一样使用int crypto_aead_decrypt(unsigned char* m, unsigned long long* mlen, ...)

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

https://codereview.stackexchange.com/questions/240591

复制
相关文章

相似问题

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