我有一个代码,写在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加密存在几个问题。
-
rand()函数文档:"此函数不生成加密安全值,并且不应用于加密目的。如果你需要一个加密安全的值"。看到:mcrypt_create_iv。
-
如果输入的密钥是文本,例如密码,使用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