美文网首页
iOS AES+Base64 encode 留着备用

iOS AES+Base64 encode 留着备用

作者: 砖加 | 来源:发表于2017-08-22 10:29 被阅读0次

最近整理资料,觉得有用的就直接整理到简书上来啦.希望对小伙伴们有用.至于怎么封装就看自己的风格了.


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  搜索就行了.

相关文章

网友评论

      本文标题:iOS AES+Base64 encode 留着备用

      本文链接:https://www.haomeiwen.com/subject/vvbkdxtx.html