美文网首页
AES128加密解密(key和向量)

AES128加密解密(key和向量)

作者: 辛乐 | 来源:发表于2019-10-21 14:32 被阅读0次

参考文章:https://www.jianshu.com/p/eaa3d9df3ef5?from=singlemessage&isappinstalled=0
详细有OC的小坑点

主要是向量和key和后端对应好规则!!!
后台java和安卓那边用的相同的代码库,所以iOS这边没有文档完全尴尬!

  NSString *Iv = [MD5key substringWithRange:NSMakeRange(0, 16)];
  NSString *key = [MD5key substringFromIndex:(16)];
//TODO: AES128加密
+(NSString *)AES128EncryptWithText:(NSString *)text Key:(NSString *)MD5key{
    
    NSString *Iv = [MD5key substringWithRange:NSMakeRange(0, 16)];
    NSString *key = [MD5key substringFromIndex:(16)];
    
    NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
    // 'key' should be 32 bytes for AES128, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    
    char ivPtr[kCCKeySizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [Iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [data length];
    
    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr /* initialization vector (optional) */,
                                          [data bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        NSString *base64Encode = [resultData base64EncodedStringWithOptions:0];
        return base64Encode;
    }
    
    free(buffer); //free the buffer;
    return nil;
}
/**AES128解密*/
+(NSString *)AES128Decrypt:(NSString *)encryptText Key:(NSString *)MD5key{
    
    NSString *Iv = [MD5key substringWithRange:NSMakeRange(0, 16)];
    NSString *key = [MD5key substringFromIndex:(16)];
    
    char keyPtr[kCCKeySizeAES128+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    
    char ivPtr[kCCKeySizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [Iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    //将nsstring转化为nsdata
    NSData *base64Data = [encryptText dataUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES128,
                                          ivPtr /* initialization vector (optional) */,
                                          [data bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        NSString *str = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
        return str;
    }
    
    free(buffer); //free the buffer;
    return nil;
}

相关文章

  • AES128加密解密(key和向量)

    参考文章:https://www.jianshu.com/p/eaa3d9df3ef5?from=singleme...

  • iOS常用加解密方式

    AES128 AES128加密 AES128解密 3DES 3DES加密 3DES解密 DES DES加密 DES解密

  • 加解密AES128 CBC NoPadding

    加密 AES128 CBC NoPadding 将加密好的数据转成16进制的字符 解密AES128 CBC NoP...

  • iOS加密小记

    1 对称加密加密解密是同一个密钥,加解密速度快,常见的有DES,3DES,AES128,AES256等。DES已经...

  • 一:密码学

    1.密码加密:(目的:加密容易,解密难) 对称加密:使用一个key加密和解密,key 非常重要,如果一旦泄露,后果...

  • 每日一问(二十)Android网络数据的加密方式

    对称加密:加密和解密数据都是使用同一个key,这方面的算法有DES。 非对称加密:加密和解密是使用不同的key。发...

  • RSA算法

    计算机中常见的加解密技术分为两类,即对称加密(加密和解密都使用相同的密钥key)和非对称加密(加密和解密使用不同的...

  • AES128加密解密

    最近项目中用到了aes128对某些后台接口url进行加密解密的问题这里特别说明一下首先建一个NSdate的扩展类....

  • AES128加密解密

    最近项目中用到了aes128对某些后台接口url进行加密解密的问题这里特别说明一下 首先建一个NSdate的扩展类...

  • 怎么在ios中应用“RSA的私钥加密或公钥加密算法”呢?

    RSA基本原理 RSA使用"秘匙对"对数据进行加密解密.在加密解密数据前,需要先生成公钥(public key)和...

网友评论

      本文标题:AES128加密解密(key和向量)

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