【问题标题】:iPHone - AES 256 encryption without paddingiPHone - 没有填充的 AES 256 加密
【发布时间】:2010-12-27 18:06:21
【问题描述】:

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

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

【问题讨论】:

    标签: iphone security aes


    【解决方案1】:

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

    【讨论】:

    • 但是在 Java 中,我可以在使用 SecretKeySpec 类时提到“NoPadding”。
    • 这可能会在某些变体中使用密文窃取。可以这样做,但安全性取决于执行此操作的确切方式。
    【解决方案2】:

    内边距很重要。

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

    我会问你为什么要摆脱它,但我怀疑你可能只需要了解它为什么存在。

    当然,如果您真的想摆脱填充,只需将数据大小设置为密码密钥长度的倍数即可。

    【讨论】:

      【解决方案3】:

      看来你正在使用这段代码

      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];
      }
      

      【讨论】:

        【解决方案4】:

        kCCOptionPKCS7Padding 选项会为您执行此操作(我指的是粘贴代码)。 例如,如果您加密 17 个字节,那么生成的密文将是 32 个字节(下一个 16 的倍数):我们需要每个块 16 个字节;如果我们有一个 16 字节的文本,那么密文也将是 32 字节,因为填充必须是“唯一可移动的”:我们将 x 字节与值 x 相加,在这种情况下 1

        【讨论】:

        • 如何在 iPhone 编程中向“ECB”提及模式?
        • 如果你想要一个安全的系统,你就不需要欧洲央行。文档提到 CBC 是默认设置(如果你使用 CCCrypt 和 NULL 作为 iv (如你所做的那样)你会得到全 0 向量,这仍然不是很好的安全性。如果你真的想要 ECB 那么或者在选项 kCCOptionECBMode (所以KCCOptionPKCS7Padding | kCCOptionECBMode在CCCrypt的选项参数中)。当你这样做时,它是CBC。
        猜你喜欢
        • 1970-01-01
        • 2017-08-29
        • 2023-04-06
        • 2020-12-28
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        相关资源
        最近更新 更多