最近整理资料,觉得有用的就直接整理到简书上来啦.希望对小伙伴们有用.至于怎么封装就看自己的风格了.
1. 导入系统库<CommonCrypto/CommonCrypto.h>
NSString*constkInitVector =@"1234567890123456"; //长度为16的key 对用 128位加密
///加密操作: utf-8 + aes(cbc pkcs7) +base64
+ (NSString*)encryptAES128:(NSString*)content key:(NSString*)key {
NSData*contentData = [contentdataUsingEncoding:NSUTF8StringEncoding];
NSUIntegerdataLength = contentData.length;
// 为结束符'\0' +1
charkeyPtr[kCCKeySizeAES128+1];
memset(keyPtr,0,sizeof(keyPtr));
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
// 密文长度 <= 明文长度 + BlockSize
size_tencryptSize = dataLength +kCCBlockSizeAES128;
void*encryptedBytes =malloc(encryptSize);
size_tactualOutSize =0;
NSData*initVector = [kInitVectordataUsingEncoding:NSUTF8StringEncoding];
CCCryptorStatuscryptStatus =CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,// 系统默认使用 CBC,然后指明使用 PKCS7Padding
keyPtr,
kCCKeySizeAES128,
initVector.bytes,
contentData.bytes,
dataLength,
encryptedBytes,
encryptSize,
&actualOutSize);
if(cryptStatus ==kCCSuccess) {
// 对加密后的数据进行 base64 编码
return[[NSDatadataWithBytesNoCopy:encryptedByteslength:actualOutSize]base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
free(encryptedBytes);
return nil;
}
解密
+ (NSString*)decryptAES128:(NSString*)content key:(NSString*)key{
NSData* text = [[NSDataalloc]initWithBase64EncodedString:contentoptions:NSDataBase64DecodingIgnoreUnknownCharacters];
charkeyPtr[kCCKeySizeAES128+1];
bzero(keyPtr,sizeof(keyPtr));
[keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];
NSUIntegerdataLength = [textlength];
size_tbufferSize = dataLength +kCCBlockSizeAES128;
NSData*initVector = [kInitVectordataUsingEncoding:NSUTF8StringEncoding];
void*buffer =malloc(bufferSize);
size_tnumBytesDecrypted =0;
CCCryptorStatuscryptStatus =CCCrypt(
kCCDecrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
keyPtr,
kCCKeySizeAES128,
initVector.bytes,
[textbytes],
dataLength,
buffer,
bufferSize,
&numBytesDecrypted);
if(cryptStatus ==kCCSuccess) {
NSString* str = [[NSStringalloc]initWithData:[NSDatadataWithBytesNoCopy:bufferlength:numBytesDecrypted]encoding:NSUTF8StringEncoding];
returnstr;
}
free(buffer);}
//java版本加密如下 亲测可用对应上面的128位加密.
private static final StringIV_STRING="1234567890123456";
//另 Java 不需手动设置密钥大小,系统会自动根据传入的 Key 进行判断。
//加密操作:
public static String encryptAES(Stringcontent, Stringkey)
throwsInvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, UnsupportedEncodingException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
byte[]byteContent=content.getBytes("UTF-8");
// 注意,为了能与 iOS 统一
// 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
byte[]enCodeFormat=key.getBytes();
SecretKeySpecsecretKeySpec=newSecretKeySpec(enCodeFormat,"AES");
byte[]initParam=IV_STRING.getBytes();
IvParameterSpecivParameterSpec=newIvParameterSpec(initParam);
// 指定加密的算法、工作模式和填充方式
Ciphercipher= Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec,ivParameterSpec);
byte[]encryptedBytes=cipher.doFinal(byteContent);
// 同样对加密后数据进行 base64 编码
Encoderencoder= Base64.getEncoder();
returnencoder.encodeToString(encryptedBytes);
}
至于swift加密的 #pod 'CryptoSwift' # encry and decry third lib CryptoSwift- swift版本加密 可以用这个第三方, 亲测不错.直接github 搜索就行了.