AES128 in PHP and Objective-C (iOS)


AES128 in PHP and Objective-C (iOS)

我有一个代码,写在PHP上:

function aes128Encrypt($key, $data) {
    $iv = rand(1,9999999);
    $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($size,$iv);
    $key = md5($key);
    return base64_encode($iv.mcrypt_encrypt(MCRYPT_RIJNDAEL_128, pack("H*", $key) , $data, MCRYPT_MODE_CBC, $iv));
    return $data;
}
//Function for decryption of AES-128
function aes128Decrypt($key, $data) {
    $data = base64_decode($data);
    $iv = substr($data, 0, 16);
    $data = substr_replace($data, null, 0, 16);
    $key = md5($key);
    $decrypted = urlencode(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, pack("H*", $key) , $data, MCRYPT_MODE_CBC, $iv));
    $decrypted = str_replace('%00','',$decrypted);
    return urldecode($decrypted);
}

我需要在iOS上使用Objective-C编写相同的代码。我该怎么做呢?我是Objective-C的新手,所以请帮助:)

php加密存在几个问题。

  1. rand()函数文档:"此函数不生成加密安全值,并且不应用于加密目的。如果你需要一个加密安全的值"。看到:mcrypt_create_iv。

  2. 如果输入的密钥是文本,例如密码,使用md5导出密钥不再被认为是可接受的,则使用PBKDF2等函数。看到:hash_pbkdf2。

对于iOS使用Apple的Common Crypto库

请注意,Base64编码/解码与Common Crypto分开,并且是iOS7及以上版本的NSData的一部分。

您将需要的常用Crypto函数有:

CCCryptorStatus CCCrypt(
    CCOperation op,         /* kCCEncrypt, etc. */
    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
    CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
    const void *key, size_t keyLength,
    const void *iv,         /* optional initialization vector */
    const void *dataIn, size_t dataInLength,
    void *dataOut,          /* data RETURNED here */
    size_t dataOutAvailable,
    size_t *dataOutMoved)
int 
CCKeyDerivationPBKDF(
    CCPBKDFAlgorithm algorithm,
    const char *password, size_t passwordLen,
    const uint8_t *salt, size_t saltLen,
    CCPseudoRandomAlgorithm prf, uint rounds, 
    uint8_t *derivedKey, size_t derivedKeyLen)

需要的Base64方法:

- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options