gpt4 book ai didi

ios - 对象C:在CommonCrypto中,如果CCCrypt()不使用选项kCCOptionPKCS7Padding,则结果缓冲区为空

转载 作者:行者123 更新时间:2023-12-01 19:09:14 26 4
gpt4 key购买 nike

如果删除kCCOptionPKCS7Padding,则以下函数将为我返回带有空密码数据<>的正确缓冲区大小。我无法使用kCCDecrypt选项将空密文解密为纯文本。

    char keyPtr[kCCKeySizeAES128 + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCBlockSizeAES128 + 1];
memset(ivPtr, 0, sizeof(ivPtr));

[iv getCString:ivPtr
maxLength:sizeof(ivPtr)
encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionECBMode|kCCOptionPKCS7Padding,
keyPtr,
kCCBlockSizeAES128,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

如果不存在kCCOptionPKCS7Padding,则加密引擎不起作用。因此,它看起来像是强制性的,而不是选择。
我的问题:
谁使CCCrypt()在没有PKCS7填充的情况下工作?

最佳答案

这与输入数据的块对齐有关。如果输入数据长度不是加密块大小的整数倍,则必须添加填充以完成最后一个块。 CCCryptorUpdate的头文件中对此进行了一些讨论(CCCrypt实际上是CCCryptorCreate,CCCryptorUpdate,CCCryptorFinal和CCCryptorRelease依次调用):

使用分组密码执行对称加密时,
并通过kCCOptionPKCS7Padding启用填充
此函数的所有调用提供的字节数
加密可以是任意的(即总数
字节不必进行块对齐)。但是如果
填充被禁用,或者在解密时,总数
的字节数必须与块大小对齐;除此以外
CCCryptFinal()将返回kCCAlignmentError。

关于ios - 对象C:在CommonCrypto中,如果CCCrypt()不使用选项kCCOptionPKCS7Padding,则结果缓冲区为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17740113/

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