我试图直接使用源代码加密/解密文件。问题是如何在读取文件后正确地完成该操作。
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 *)
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。因此,我想知道是否有更正确的方法来做这件事。
发布于 2020-04-16 02:02:34
我想你在这里很困惑。GCM算法有一个96位的nonce,并用32位计数器填充128位块大小的其余部分。所以你有2^32个完整的街区供你使用,或者说大约64 GiB。那是-呃-略多于32位(好的,计数器从2开始,所以你有48个字节,最好保持在32 GiB或48 GiB)。
发布于 2020-04-17 21:59:17
因此,我想知道是否有更正确的方法来做这件事。
文件的加密不应假定它是缺少'\0'的文本。作为二进制文件,数据可能包含空字符,这些字符将使用strncpy()错误地复制。
// strncpy(msg, plaintext + start, end - start);
memcpy(msg, plaintext + start, end - start);“对于大文件(例如1GB)”-> 1GB不是那么大。不要将文件大小限制在int范围内,而是使用size_t。这是典型的,至少是正数范围的2倍,也可能是数十亿倍。考虑到单个数组的使用,代码在设计上仅限于size_t。最好尽可能多地使用范围。
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, ...)。
https://codereview.stackexchange.com/questions/240591
复制相似问题