【问题标题】:Objective-C AES key length how to fixing 16 bytesObjective-C AES 密钥长度如何固定 16 个字节
【发布时间】:2018-06-19 16:09:00
【问题描述】:

我是 Objective-c 和 aes 加密的新手。

我正在使用 AES 加密和解密不同平台(ios、android、c#)上的数据。在 Java 和 C# 代码上为不同的情况创建新密钥,我只使用前 16 个字节的密钥。

像这样:

Java:

private static byte[] getKeyBytes(String key) throws UnsupportedEncodingException {
    byte[] keyBytes = new byte[16];
    byte[] parameterKeyBytes = key.getBytes(characterEncoding);
    System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, 
    Math.min(parameterKeyBytes.length, keyBytes.length));
    return keyBytes;
}

C#:

 public static RijndaelManaged GetRijndaelManaged(String secretKey)
    {
        var keyBytes = new byte[16];
        var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
        Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
        return new RijndaelManaged
        {
            Mode = CipherMode.CBC,
            Padding = PaddingMode.PKCS7,
            KeySize = 128,
            BlockSize = 128,
            Key = keyBytes,
            IV = ivBytes
        };
    }

这些显然有效。 在 obj-c 中,当密钥大小小于 16 个字符时,加密大部分工作正确。但关键是如果大于 16 个字符,加密将无法正常工作。如何将密钥字节大小固定为 16 并使用它?还是其他方式?

Obj-C AES 方法:

  - (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
    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(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

【问题讨论】:

    标签: ios objective-c encryption aes


    【解决方案1】:

    AES 不支持小于 16 字节的密钥大小,它只支持三种密钥大小 L 128、192 和 256 位。如果您使用较小的密钥,则额外的字节必须来自某个地方。有些实现会添加空字节,有些只会在垃圾字节跟在提供的键字节后面的地方使用。

    解决方法:始终使用正确的长度密钥。

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2021-01-07
      • 1970-01-01
      • 2017-04-26
      • 2015-02-05
      相关资源
      最近更新 更多