可以参考之前写的:
Java和C/C++进行DES/AES密文传输。现在老革命遇到新问题,需要开发IOS应用。之前了解了一定的加密知识,整个过程还是比较顺利的。
使用CommonCryptor.h的方法进行加解密。几个关键参数设置如下:
加密算法:kCCAlgorithmAES128 (
kCCAlgorithmAES也一样);
iv: 设置为nil就可以了。因为ECB方式不需要初始化向量。如果不是采用ECB,那么除了密钥之外,加解密放的初始化向量也必须一致。
options: (kCCOptionPKCS7Padding | kCCOptionECBMode)。 后一个option比较明显,因为其他端也是采用ECB。第一个option就比较曲折。一开头到处找PKCS5Padding,发现体位都很复杂,差点想引入openssl。不过后面搜索到PKCS7Padding和PKCS5Padding是兼容的(黑线
),经测试还真的是兼容的。于是blabla搞定。
网上找到一个开源的(NSData+CommonCrypto),撸来用了,写起来比较方便,加密代码:
-(NSData*) encryptText:(NSString*)text {
CCCryptorStatus status = kCCSuccess;
NSData* result = [[text dataUsingEncoding:NSUTF8StringEncoding]
dataEncryptedUsingAlgori
thm:kCCAlgorithmAES128
key:[self getAesKey]
initializationVector:nil
// ECB加密不会用到iv
options:(kCCOptionPKCS7Padding|kCCOptionECBMode)
error:&status];
if (status != kCCSuccess) {
DLog(@"加密失败:%d", status);
return nil;
}
return result;
}
解密代码如下:
-(NSString*) decryptText:(NSData*)data {
CCCryptorStatus status = kCCSuccess;
NSData* result = [data
decryptedDataUsingAlgori
thm:kCCAlgorithmAES128
key:[[self getAesKey]
initializationVector:nil
// ECB解密不会用到iv
options:(kCCOptionPKCS7Padding|kCCOptionECBMode)
error:&status];
if (status != kCCSuccess) {
DLog(@"加密失败:%d", status);
return nil;
}
return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}
经测试,可以与Java服务端(ECB + PKCS5Padding)进行文本的加解密操作。