iPHone - AES 256加密,无填充

时间:2010-12-27 18:06:22

标签: iphone security aes

我在iphone上看到了一些针对AES 256加密的帖子。 其中一篇帖子是http://pastie.org/426530 但所有帖子都使用了某种填充。如何在不使用任何填充的情况下使用AES256加密?

因为,我正在与没有填充处理加密/解密的服务器进行通信。但是在iphone上,我只能使用kCCOptionPKCS7Padding或kCCOptionECBMode模式。如何编写我的iPhone应用程序以便加密/解密成功发生?

4 个答案:

答案 0 :(得分:2)

分组密码将始终是其块大小的倍数。当数据不完全适合密码流时,它会被填充。因此,无需禁用填充。

答案 1 :(得分:1)

填充是很重要的。

http://www.vbdotnetheaven.com/UploadFile/gsparamasivam/cryp04112005063256AM/cryp.aspx

我会问你为什么要摆脱它,但我怀疑你可能只是需要理解为什么会这样。

当然,如果您真的想摆脱填充,只需使您的数据大小为密钥长度的倍数。

答案 2 :(得分:1)

好像你正在使用这段代码

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                      tempkey, kCCKeySizeAES256,
                                      (void*)IV /* initialization vector (optional) */,
                                      input_raw_data, data_length, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted );

我也遇到了同样的问题,我找到了不使用上述功能的解决方案,它会在加密时增加额外的字节。只需使用这两个函数而不是这个函数。这是我的解决方案

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );

size_t numBytesEncrypted = 0;

CCCryptorRef ccRef;
CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, 0, tempkey, kCCKeySizeAES256, IV, &ccRef);
CCCryptorStatus cryptStatus = CCCryptorUpdate(ccRef, input_raw_data, data_length, buffer, bufferSize, &numBytesEncrypted);

CCCryptorRelease(ccRef);
if( cryptStatus == kCCSuccess )
{
  //the returned NSData takes ownership of the buffer and will free it on deallocation
  return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

答案 3 :(得分:0)

选项kCCOptionPKCS7Padding为您执行此操作(我参考了pastie代码)。 例如,如果加密17个字节,则生成的密文将为32个字节(16的下一个倍数):每个块需要16个字节;如果我们有16字节的文本,那么密文也将是32字节,因为填充必须是“唯一可移除的”:我们在这种情况下为x <= x <= 16添加值为x的x字节。在解密期间,使用该选项自动完成(并检查错误)。如果你用CBC加密/解密(我不清楚这是否是这种情况,我怀疑不是)我们在密文的开头添加另一个随机IV块,这是为了确保在同一个密钥下加密相同的明文以后很可能导致不同的密文。所以这是推荐的做法。 如果您不想填充,则可以在流模式下使用分组密码,例如计数器模式或CFB模式。您仍然需要进行一些扩展,因为您还必须添加IV或nonce,也需要16个字节。