- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS常用加密算法介绍和代码实践由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
iOS系统库中定义了软件开发中常用的加解密算法,接口为C语言形式。具体包括了以下几个大类: 。
1
2
3
4
5
|
#include <CommonCrypto/CommonCryptor.h> //常用加解密算法
#include <CommonCrypto/CommonDigest.h> //摘要算法
#include <CommonCrypto/CommonHMAC.h>
#include <CommonCrypto/CommonKeyDerivation.h>
#include <CommonCrypto/CommonSymmetricKeywrap.h>
|
其中第一类常用加解密算法就包含了AES,DES,和已经废弃的RC4,第二类摘要算法,包括如MD5,SHA等。本文主要介绍AES,MD5,SHA三种最常用算法的实现。 1 对称密码算法--AES AES主要应用在关键数据和文件的的保密同时又需要解密的情形,其加密密钥和解密密钥相同,根据密钥长度分为128、192和256三种级别,密钥长度越大安全性也就越大,但性能也就越低,根据实际业务的安全要求来决定就好。通常情况,对一些关键数据进行加密的对象都是字符串,加密结果也以字符串进行保存,所以在设计接口的时候参数和返回值均为字符串。(关于关键参数的意义放在代码后讲解。) 。
1.1 加密过程 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
-(NSString *)aes256_encrypt:(NSString *)key
{
const
char
*cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:self.length];
//对数据进行加密
char
keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof
(keyPtr));
[key getCString:keyPtr maxLength:
sizeof
(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t
bufferSize = dataLength + kCCBlockSizeAES128;
void
*buffer =
malloc
(bufferSize);
size_t
numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if
(cryptStatus == kCCSuccess)
{
NSData *result = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
//base64
return
[result base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
else
{
return
nil;
}
}
|
1.2 解密过程 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
-(NSString *)aes256_decrypt:(NSString *)key
{
NSData *data = [[NSData alloc] initWithBase64EncodedData:[self dataUsingEncoding:NSASCIIStringEncoding] options:NSDataBase64DecodingIgnoreUnknownCharacters];
//对数据进行解密
char
keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof
(keyPtr));
[key getCString:keyPtr maxLength:
sizeof
(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
size_t
bufferSize = dataLength + kCCBlockSizeAES128;
void
*buffer =
malloc
(bufferSize);
size_t
numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if
(cryptStatus == kCCSuccess)
{
NSData* result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return
[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
}
else
{
return
nil;
}
}
|
1.3 接口调用示例 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
int
main(
int
argc,
const
char
* argv[]) {
@autoreleasepool
{
NSString *plainText = @
"O57W05XN-EQ2HCD3V-LPJJ4H0N-ZFO2WHRR-9HAVXR2J-YTYXDQPK-SJXZXALI-FAIHJV"
;
NSString *key = @
"12345678901234561234567890123456"
;
NSString *cryptText = [plainText aes256_encrypt:key];
NSLog(@
"cryptText:\n%@"
,cryptText);
NSString *newPlainText = [cryptText aes256_decrypt:key];
NSLog(@
"newPlainText:%@"
,newPlainText);
NSString *newCrypText3 = @
"u7cKED8fscZ6Czs5eU7eMXnm6/5awKzWbUFk+D1jQdZIm5JUnKgqNzI/vmiwFPvY5qD5VIfH7qAJzjDSZXNkspG/b4if5bSkdfFp/3Aysbw="
;
NSString *newPlainText3 = [newCrypText3 aes256_decrypt:key];
NSLog(@
"newPlainText3:%@"
,newPlainText3);
}
return
0;
}
|
1.4 关键参数的意义 要熟练掌握AES算法的使用,必须要了解其几种工作模式、初始化向量、填充模式等概念,通常情况还需要多平台保持一致的加解密结果,使用时务必多做确认。(可以使用在线网站加解密进行自我验证。) kCCKeySizeAES256 密钥长度,枚举类型,还有128,192两种。 kCCBlockSizeAES128 块长度,固定值 16(字节,128位),由AES算法内部加密细节决定,不过哪种方式、模式,均为此。 kCCAlgorithmAES 算法名称,不区分是128、192还是258。kCCAlgorithmAES128只是历史原因,与kCCAlgorithmAES值相同。 kCCOptionPKCS7Padding 填充模式,AES算法内部加密细节决定AES的明文必须为64位的整数倍,如果位数不足,则需要补齐。kCCOptionPKCS7Padding表示,缺几位就补几个几。比如缺少3位,则在明文后补3个3。iOS种只有这一种补齐方式,其它平台方式更多,如kCCOptionPKCS5Padding,kCCOptionZeroPadding。如果要实现一致性,则此处其它平台也要使用kCCOptionPKCS7Padding。 kCCOptionECBMode 工作模式,电子密码本模式。此模式不需要初始化向量。iOS种只有两种方式,默认是CBC模式,即块加密模式。标准的AES除此外还有其它如CTR,CFB等方式。kCCOptionECBMode模式下多平台的要求不高,推荐使用。CBC模式,要求提供相同的初始化向量,多个平台都要保持一致,工作量加大,安全性更高,适合更高要求的场景使用。 base64 一种unicode到asci码的映射,由于明文和密文标准加密前后都可能是汉字或者特殊字符,故为了直观的显示,通常会对明文和密文进行base64编码.
2 摘要算法 摘要算法,具有单向不可逆的基本性质,速度快。 2.1 消息摘要算法MD5 MD5算法将任意明文(不为空)映射位32位字符串。数字签名和复杂的加密系统中都有使用,单独使用由于撞库原因安全性较低。 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
- (NSString *)md5HexDigest
{
const
char
*cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
unsigned
char
result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cstr, (unsigned
int
)
strlen
(cstr), result);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for
(
int
i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@
"%02x"
, result[i]];
return
output;
}
|
这里将结果以16进制字符串形式保存,也可以进行base64等其它处理.
2.2 安全散列算法SHA SHA按结果的位数分为256、484、512三种基本方式,根据对结果的要求而选择即可。通过CC_SHA256_DIGEST_LENGTH等枚举类型进行设置。 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
- (NSString *)sha256HexDigest
{
const
char
*cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:self.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (unsigned
int
)data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for
(
int
i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
[output appendFormat:@
"%02x"
, digest[i]];
return
output;
}
|
3 未完待续,后期介绍RSA非对称密码的使用.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于iOS常用加密算法介绍和代码实践的文章就讲到这里了,如果你想了解更多关于iOS常用加密算法介绍和代码实践的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试用 C 编写一个简单的加密程序。我的目标是将 abc(它可以是任何单词)翻译成 123。然后乘以 2 得到 246 然后再次翻译成文本,然后在屏幕上写 bdf。这是我的算法,它不能正常工作。
互联网上有很多关于加密的答案,但我一直无法找到我正在寻找的东西:使用 c# 提供的工具对字符串和文本文件进行加密的简单强加密。 我的主要问题是我不知道如何将 IV 保存到文本文件的开头或如何创建随机
C#“RSACryptoServiceProvider”加密算法是 Microsoft-CryptoAPI 的一部分吗? 通过在 .Net 中使用 CryptoAPI 而不是“RSACryptoSer
我正在编写适用于“流”的 XXTEA 加密算法的实现,即可以像这样使用:crypt mykey 输出。 其中一个先决条件是它根本无法访问文件(它只读取固定大小的 block ,直到找到 EOF)。该
嘿,这是我老师给我的一个加密例子。但是,我仍然搞不懂(Int)Message[i]是什么意思?那么程序在这条线上做什么呢?
嘿,这是我老师给我的一个加密例子。但是,我仍然搞不懂(Int)Message[i]是什么意思?那么程序在这条线上做什么呢?
嘿,我研究这个已经有一段时间了,我记得我的兄弟引导我完成了这个完全相同的算法。 基本上,它只是添加键中字符和短语的 ascii 值。 我可以用这个加密它: def encrypt(key, strin
我正在尝试将 BouncyCaSTLe 与 android 一起使用来实现 ECDH 和 EL Gamal。我已经添加了 bouncycaSTLe jar 文件 (bcprov-jdk16-144.j
我需要加密一个数字,我和这个加密的值将提供给客户询问 key ,所以我想尽量减少数字的数量并使它们都可以打印。 所以我希望结果要么全是数字,要么全是十六进制字符。 我正在使用的当前加密方法(对于非数字
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我正在制作 note taking web app它会在您键入时连续保存笔记。我正在发送差异以防止通过线路发送过多数据,这在注释为纯文本时工作正常。 然而,我添加了对加密笔记的支持,所以笔记只会以加密
我正在寻找一种与 JavaScript 和 Java 兼容的安全对称 key 加密算法。 我已经尝试实现一个,但我遇到了一些编码问题。 最佳答案 您不想使用 JavaScript 加密,especia
目录 1 MD5 1.1 算法定义 1.2 MD5算法不安全的原因 1.2.1 字典表很大 1
在查看一些旧的 Coldfusion 代码时,我发现了几个通过加密/解密函数使用 CFMX_COMPAT 算法加密的数据实例。 找了一阵子,一直没找到这是什么算法。文档提到它现在是最不安全的方法,但我
谁能告诉我 iOS 上 SUP 用来加密底层数据库的加密算法是什么? 它是否依赖于 SQLite EE(加密扩展),如果是,使用了 4 种可用算法中的哪一种? 我的猜测是某种 AES,但官方文档中没有
我一直有这个问题。 The specified cryptographic algorithm is not supported on this platform. Exception Details
我正在为一个项目实现 3Des 加密算法。 我使用此代码作为示例: http://www.java2s.com/Code/Java/Security/TripleDES.htm 它工作正常,但我需要发
我正在尝试使用 adobe type 1 字体加密算法来加密文本文件。但是,我不知道如何用汇编语言正确地实现算法。如果可以,请帮助我。 下面是adobe type 1字体加密算法: unsigned
如何添加/创建具有特定加密算法的 c/c++ OpenSSL 静态库?假设我不想实现 md5。如何创建没有 md5 的库? 最佳答案 在配置脚本中你可以指定no-选项,它会在没有你指定的密码的情况下构
我检查了 TripleDES。它的 block 大小是 64 位。 有没有针对8位 block 大小的算法? 谢谢 编辑:我不打算将其用于完美保护,而是用于以防万一的情况,即看到代码的人不应该找到明文
我是一名优秀的程序员,十分优秀!