iOS—AES加密(128 CBC/ECB NoPadding/PKCS7Padding)

AES/ECB/PKCS7Padding(aes128加密解密) AES加密,ECB模式,128位,pkcs7Padding 字符处理方式 阅读详情

项目开发过程中,经常会使用各种加密手段来保证数据的安全性,常见的有MD5,DES,AES等等。摘取百度百科AES词条的简介:AES即高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

  以上可见AES作为一项加密技术使用是很普遍的,博主之前的一个项目跟后台交换数据时就需要使用到AES 128 ECB NoPadding加密,但是苦于网上的关于AES的博客内容大同小异,基本都是AES 128 CBC NoPadding加密,所以纠结了很久。从网上下载下来的AES 128 CBC NoPadding加密方法针对后台数据的加密解密失灵时不灵(后台是ECB模式)。后来自己鼓捣了很长时间总算是弄出来了,网上档下来的方法可以使用,不过需要修改部分代码,让我们先看看网上比较多的AES 128 CBC NoPadding的方法(方法来自博客:http://www.cnblogs.com/wanyakun/p/3403352.html)。

  首先,.h文件:

#import <Foundation/Foundation.h>

@interface AESEnrypt : NSObject

+ (NSString*) AES128Encrypt:(NSString *)plainText;

+ (NSString*) AES128Decrypt:(NSString *)encryptText;

@end

  然后是.m文件:

#import "AESEncrypt.h"
#import <CommonCrypto/CommonCryptor.h>
#import "GTMBase64.h"

#define gkey @"16位长度的字符串" //自行修改
#define gIv @"16位长度的字符串" //自行修改

@implementation AESEncrypt

+(NSString *)AES128Encrypt:(NSString *)plainText
{
    char keyPtr[kCCKeySizeAES128+1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128+1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [data length];
    
    int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
    int newSize = 0;
    
    if(diff > 0)
    {
        newSize = dataLength + diff;
    }
    
    char dataPtr[newSize];
    memcpy(dataPtr, [data bytes], [data length]);
    for(int i = 0; i < diff; i++)
    {
        dataPtr[i + dataLength] = 0x00;
    }
    
    size_t bufferSize = newSize + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    memset(buffer, 0, bufferSize);
    
    size_t numBytesCrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          0x0000,               //No padding
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          ivPtr,
                                          dataPtr,
                                          sizeof(dataPtr),
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
        return [GTMBase64 stringByEncodingData:resultData];
    }
    free(buffer);
    return nil;
}

+(NSString *)AES128Decrypt:(NSString *)encryptText
{    
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmAES128,
                                          0x0000,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
        return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];
    }
    free(buffer);
    return nil;
}

@end

  以上就是最基本的AES 128 CBC Nopadding的加密算法了。如果要使用ECB或者PKCS7Padding模式那么,就需要在.m文件里简单的作出点修改,修改CCCryptorStatus的初始化,如下:

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          0x0000 | kCCOptionECBMode, // 这里添加ECB模式,如果需要PKCS7Padding,那么后面再加上 | kCCOptionPKCS7Padding即可
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          ivPtr,
                                          dataPtr,
                                          sizeof(dataPtr),
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);    

  当然,加密解密里面都需要修改CCCryptorStatus的初始化,保持一致。

  PS:博主在使用自己修改后的AES 128 ECB Nopadding加密方法的时候,遇到一个问题,就是解密之后的字符串末尾会有一长串的'\0'结束符,这样导致无法正确解析JSON对象,虽然经过简单处理不影响使用,但是最好还是一步到位最合适,不知有没有大神能帮助解决下这个问题。


转:http://www.cnblogs.com/leotangcn/p/4248414.html


Java之AES/ECB/PKCS7Padding加密方式 更安全的加密。 阅读详情

相关推荐

AES加密解密(ECB模式)

希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。

2401_84121485的博客 3840

(AES/DES)/ECB/NoPadding 加密问题相关

关于AES和DES加密中用到的模式以及填充方式相关,参考 https://www.jianshu.com/p/7c5b4a3c2c30 本文只介绍NoPadding java相关实现(kotlin,其实和java一样= =) 首先需要知道如下两点: 1、AES的NoPadding模式加密的key和data的byte字节数必须为16的倍数 2、DES的NoPadding模式加密...

m190607070的专栏 8471

CryptoJS 4.x 前端AES加密实战:ECB模式与CBC模式3种填充方案对比

本文详细介绍了CryptoJS 4.x在前端实现AES加密的实战技巧,重点对比了ECB模式与CBC模式,并分析了Pkcs7、ZeroPadding等3种填充方案的性能与安全性。通过具体代码示例和工程实践,为开发者提供了全面的加密方案选型指导,帮助提升前端数据安全传输能力。

weixin_33937499的博客 291

java实现AES/ECB/PKCS7Padding加密和解密

工作中遇到AES算法相关问题,进行一次记录,如有问题,欢迎大家指出~ AES算法 一种高级加密标准(英语:Advanced Encryption Standard,缩写:AES)在密码学中又称Rijndael加密法。 美国联邦政府采用的一种区块加密标准。 这个标准用来替代原先的DES。 是对称密钥加密中最流行的算法之一。 学习AES算法首先了解三个点:密钥、填充和模式。 密钥 实现加密和解密的基础,对明文的加密和解密需要同一个密钥。AES128,AES192,AES256,实际上就是指AES算法对不

m0_49234671的博客 2万+

Android开发中AES加密实战:从CBC模式到Keystore安全存储

对称加密是保障数据机密性的核心技术,其中AES(高级加密标准)因其高效与安全性成为行业首选。其原理基于分组密码,通过固定长度的数据块与密钥进行多轮变换实现加密。在移动开发领域,AES的技术价值在于为本地存储、网络通信等场景提供可靠的端到端数据保护。实际应用中,开发者需关注工作模式的选择,如CBC模式通过初始化向量(IV)增强安全性,并需结合Android Keystore系统实现密钥的安全管理,避免密钥泄露风险。本文聚焦于Android平台,深入解析AES-CBC模式的正确实现与生产环境下的避坑指南。

weixin_34342905的博客 373

直播APP付费流AES/ECB加密逆向分析与解密实战

AES(高级加密标准)是一种广泛应用的对称加密算法,它通过固定长度的密钥对数据进行分块加密,确保数据的机密性。其工作原理是将明文划分为等长的数据块,并利用密钥进行多轮的替换和置换操作,生成不可读的密文。在移动应用开发中,AES常用于保护网络传输中的敏感数据,如用户凭证、支付信息和媒体流地址,以防止中间人攻击和数据泄露。然而,直接使用AES的ECB模式存在安全风险,因为相同的明文块会产生相同的密文块,可能暴露数据模式。本文通过一个直播APP付费流获取的真实案例,详细展示了如何结合网络抓包、APK逆向工程和动态

weixin_30788239的博客 403

iOS开发——AES加密(128 CBC/ECB NoPadding/PKCS7Padding)

  项目开发过程中,经常会使用各种加密手段来保证数据的安全性,常见的有MD5,DES,AES等等。摘取百度百科AES词条的简介:AES即高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标...

weixin_30492047的博客 582

AES加密算法深度解析:从原理到实战,避免常见安全陷阱

对称加密是信息安全的基础,它使用同一密钥进行数据的加密与解密,具有计算效率高的特点,广泛应用于数据传输与存储保护。其核心原理在于通过复杂的数学变换,将明文转换为不可读的密文,确保即使算法公开,没有密钥也无法破解。这项技术的核心价值在于为数字世界提供了可靠的机密性保障,是构建安全通信、隐私保护系统的基石。在工程实践中,AES作为最主流的对称加密标准,其工作模式的选择、密钥管理和填充机制直接决定了应用的安全性。例如,在涉及金融数据传输或用户隐私保护的场景中,不当使用ECB模式或固定IV会导致严重的安全漏洞。本文

weixin_30813225的博客 381

java AES对称加密工具类PKCS5Padding及PKCS7Padding

package com.util; import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES加密工具类 ..

qq_36431127的博客 1641

AES加密算法深度解析:从核心原理到实战应用与安全实践

对称加密是信息安全领域的基石技术,它使用同一把密钥进行数据的加密与解密,确保了信息传输和存储的机密性。其核心原理在于通过复杂的数学变换,将明文转换为不可读的密文,只有持有正确密钥的授权方才能恢复原始信息。这项技术的核心价值在于为数字世界提供了高效、可靠的数据保护机制,广泛应用于网络通信、数据存储、移动应用和物联网设备等场景。AES(高级加密标准)作为目前全球公认最安全、应用最广泛的对称加密算法,其内部轮函数、密钥扩展和工作模式的设计,为现代密码学工程实践树立了典范。本文以AES为例,结合Android设备解

weixin_30703911的博客 318

Android AES加密方案:非Java实现与JNI+OpenSSL高性能优化

AES(高级加密标准)作为对称加密算法的核心,通过分组密码和轮函数(SubBytes、ShiftRows、MixColumns、AddRoundKey)确保数据安全,广泛应用于网络传输、本地存储等场景。其技术价值在于平衡安全性与效率,成为Android开发中数据加密的首选。然而,标准Java实现(javax.crypto.Cipher)在跨平台一致性、性能优化和特定安全合规要求下存在局限。本文聚焦于构建非Java的AES解决方案,通过JNI调用OpenSSL库实现高性能本地加密,并结合纯Kotlin算法作为

weixin_34199335的博客 376

AES CBC 加密解密,带偏移量

import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEn...

qq_27319683的博客 1万+

AES加密算法深度解析:从数学原理到工程实践

对称加密是现代信息安全体系的基石,它通过同一密钥实现数据的加密与解密,在保障通信隐私和数据安全方面发挥着核心作用。其基本原理基于复杂的数学变换和密钥调度,通过多轮迭代运算实现数据的混淆与扩散,确保即使已知算法细节,没有密钥也无法破解密文。这种技术为各类应用提供了高效可靠的数据保护能力,广泛应用于网络通信、数据存储和身份认证等场景。在众多对称加密算法中,AES(高级加密标准)因其卓越的安全性和高效的实现,已成为行业事实上的黄金标准。本文聚焦AES算法的内部工作机制,深入剖析其状态矩阵、密钥扩展和轮函数等核心组

dianxi0949的博客 407

AES

ios端的加密方式有以下几种 1:AES(对称加密) 2:RSA(非对称加密) 算法摘要 3:MD5 4:base64 5:动态生成密码(时间戳) 1.AES 1.1简介 对称加密算法又称传统加密算法。加密和解密使用同一个 密钥 那么他有128,192, 256三种秘钥 加密模式有ecb,cbc,cfb,ofb AES128 CBC No Padding加密方式 AES1...

江苏小白龙 312

AES加密算法详解:从核心原理到跨平台实战与安全实践

对称加密算法是现代信息安全体系的基石,它使用同一密钥进行加密和解密,在保障数据机密性的同时兼顾了运算效率。其核心原理在于通过多轮复杂的替换和置换操作,将可读的明文转换为不可读的密文,从而有效抵御密码分析攻击。这项技术的核心价值在于为数据传输和静态存储提供了高效、可靠的保密性保障,广泛应用于网络通信、数据库加密、文件保护等场景。深入理解其工作模式与密钥管理至关重要,例如,GCM模式因其同时提供加密和认证功能,已成为TLS协议等现代应用的首选;而CBC模式虽经典,但必须正确使用随机初始化向量(IV)才能避免安全

weixin_34326179的博客 648

MFC框架下AES与DES对称加密算法的C++实现与工程实践

对称加密算法是现代信息安全的基础,它使用相同的密钥进行数据的加密与解密,确保了信息的机密性。其核心原理在于通过复杂的数学变换和轮函数迭代,将明文转换为难以解读的密文。AES(高级加密标准)和DES(数据加密标准)作为两种经典的对称加密算法,在数据保护、通信安全和本地存储加密等场景中具有广泛的应用价值。本文聚焦于在MFC(Microsoft Foundation Classes)框架下,从零实现这两种算法的C++核心代码,并探讨如何将其封装为带有图形界面的演示工具。通过深入解析AES的SPN结构、T表优化以及

weixin_30509393的博客 401

使用java进行 AES 加密 解密

 最近项目用到了加密技术,需要把数据进行加密传输,用到了AES;      百度百科是这样定义的:      高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术...

我的笔记 1562

从凯撒密码到AES:加密算法演进与安全实践指南

加密算法是信息安全的核心基础,其设计原理从古典替换发展到现代分组密码,核心在于混淆与扩散原则。对称加密如AES通过多轮迭代和S盒实现高强度保护,而非对称加密如RSA则解决了密钥分发难题。在工程实践中,伪随机数生成和哈希函数是加密体系的重要基石,确保密钥安全和数据完整性。本文以凯撒变换和AES为例,系统梳理加密技术演进脉络,涵盖频率分析攻击、工作模式选择等实战要点,帮助开发者构建安全通信模型并规避常见漏洞。

weixin_30697239的博客 340
上一篇: iOS9+Xcode7免越狱免证书直接调试
下一篇: beginBackgroundTaskWithExpirationHandler
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值