【问题标题】:Decode AES 256?解码 AES 256?
【发布时间】:2017-11-20 19:29:16
【问题描述】:

我有这个解码方法:

-(NSString *)decrypt:(NSString *)encryptedTextValue withSecret:(NSString*)secret
{
    NSData *encryptedData = [NSData base64DataFromString:encryptedTextValue];
    NSData *decryptedData = [encryptedData decryptedAES256DataUsingKey:[[secret dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:nil];
    NSString *plainText =  [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    return plainText;
}

和解密的AES256DataUsingKey方法,是这样的:

- (NSData *) AES256EncryptedDataUsingKey: (id) key error: (NSError **) error
{
    CCCryptorStatus status = kCCSuccess;
    NSData * result = [self dataEncryptedUsingAlgorithm: kCCAlgorithmAES128
                                                  key: key
                                              options: kCCOptionPKCS7Padding
                                                error: &status];

    if ( result != nil )
        return ( result );

    if ( error != NULL )
        *error = [NSError errorWithCCCryptorStatus: status];

    return ( nil );
}

我也有哈希,即:

wnXGfwFQr4463RLAczVJGw==

谁能告诉我如何将其解码为原始字符串? 我也有密钥,但我不明白我应该如何 ecnode 来解码哈希。

【问题讨论】:

  • 你有secret吗? hashe 是什么,不是它的价值是什么?
  • @zaph 是的,我有秘密。这个方法来自框架,叫做 Securely,它在应用程序上编码一些信息,这些信息是用 Appcelerator 编码的,现在我正在将应用程序转换为本地语言(Swift),并且需要解码以前的 Keychain key;value 对。
  • 请参阅this answer 示例使用 Common Crypto 的 Swift 代码,它有助于您的转换。
  • @zaph 你知道吗,我应该以哪种方式将秘密传递给那个函数?如果我只使用字符串,那么我会收到错误>>错误 aesCBCEncrypt: KeyError("Invalid key length", 18) 看起来在我发布的方法中,它需要密钥的 SHA256 哈希值或其他东西,

标签: objective-c encoding aes decoding string-decoding


【解决方案1】:

查看这个使用 Common Crypto 的 Swift AES 加密示例,它有助于您的转换。

func testCrypt(data:Data, keyData:Data, ivData:Data, operation:Int) -> Data {
    let cryptLength  = size_t(data.count + kCCBlockSizeAES128)
    var cryptData = Data(count:cryptLength)
    let keyLength = size_t(kCCKeySizeAES128)
    let options   = CCOptions(kCCOptionPKCS7Padding)
    var numBytesEncrypted :size_t = 0

    let cryptStatus = cryptData.withUnsafeMutableBytes {cryptBytes in
        data.withUnsafeBytes {dataBytes in
            ivData.withUnsafeBytes {ivBytes in
                keyData.withUnsafeBytes {keyBytes in
                    CCCrypt(CCOperation(operation),
                              CCAlgorithm(kCCAlgorithmAES),
                              options,
                              keyBytes, keyLength,
                              ivBytes,
                              dataBytes, data.count,
                              cryptBytes, cryptLength,
                              &numBytesEncrypted)
                }
            }
        }
    }

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.removeSubrange(numBytesEncrypted..<cryptData.count)

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

您可以使用哈希并根据所需的密钥大小选择字节。但是为了安全起见,使用 PBKDF2(基于密码的密钥推导 2),迭代计数大约需要 100 毫秒。这是Swift Implementation

另一种选择是使用 RNCryptor,其中包括 PBKDDF2、身份验证和版本控制。

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多