几种常见加密算法初窥及如何选用加密算法
以前写文章总喜欢先废话一堆,这次就免了,直入主题。
加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
几种对称性加密算法:AES,DES,3DES
DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。
相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。
几种非对称性加密算法:RSA,DSA,ECC
RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。
几种线性散列算法(签名算法):MD5,SHA1,HMAC
这几种算法只生成一串不可逆的密文,经常用其效验数据传输过程中是否经过修改,因为相同的生成算法对于同一明文只会生成唯一的密文,若相同算法生成的密文不同,则证明传输数据进行过了修改。通常在数据传说过程前,使用MD5和SHA1算法均需要发送和接收数据双方在数据传送之前就知道密匙生成算法,而HMAC与之不同的是需要生成一个密匙,发送方用此密匙对数据进行摘要处理(生成密文),接收方再利用此密匙对接收到的数据进行摘要处理,再判断生成的密文是否相同。
对于各种加密算法的选用:
由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。
在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。
对于几种加密算法的内部实现原理,我不想研究的太透彻,这些问题就留给科学家们去研究吧。而对于其实现而言,网上有很多开源版本,比较经典的是PorlaSSL(官网:http://en.wikipedia.org/wiki/PolarSSL )。其它语言如JAVA,OBJC也都有相应的类库可以使用。以下附上自己用OC封装的通用加密类:
- CryptionUseSysLib.h
- //
- // CryptionUseSysLib.h
- // encoding
- //
- // Created by weiy on 12-7-25.
- // Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
- //
- #import <Foundation/Foundation.h>
- #import <CommonCrypto/CommonDigest.h>
- #import <CommonCrypto/CommonCryptor.h>
- @interface CryptionUseSysLib : NSObject{
- }
- + (NSData *) md5:(NSString *)str;
- + (NSData *) doCipherUseAesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt;
- + (NSData *) doCipherUse3DesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt;
- + (NSData *) doCipherUseDesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt;
- + (NSData *) doCipherUseCastMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt;
- + (NSString *) encodeBase64WithString:(NSString *)strData;
- + (NSString *) encodeBase64WithData:(NSData *)objData;
- + (NSData *) decodeBase64WithString:(NSString *)strBase64;
- @end
- CryptionUseSysLib.m
- //
- // CryptionUseSysLib.m
- // encoding
- //
- // Created by weiy on 12-7-25.
- // Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
- //
- #import "CryptionUseSysLib.h"
- static const char _base64EncodingTable[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- static const short _base64DecodingTable[256] = {
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
- -2, 0, 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, -2, -2, -2, -2, -2,
- -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
- -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
- };
- @implementation CryptionUseSysLib
- + (NSString *) md5:(NSString *)str
- {
- const char *cStr = [str UTF8String];
- unsigned char result[CC_MD5_DIGEST_LENGTH];
- CC_MD5( cStr, strlen(cStr), result );
- return [NSString
- stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
- result[0], result[1],
- result[2], result[3],
- result[4], result[5],
- result[6], result[7],
- result[8], result[9],
- result[10], result[11],
- result[12], result[13],
- result[14], result[15]
- ];
- }
- + (NSData *)doCipher:(NSData *)sTextIn
- key:(NSData *)sKey
- Algorithm:(CCAlgorithm)algorithm
- context:(CCOperation)encryptOrDecrypt {
- NSData * dTextIn;
- dTextIn = [sTextIn mutableCopy];
- NSMutableData * dKey = [sKey mutableCopy];
- int moreSize = 0;
- //make key to standard;
- switch (algorithm) {
- case kCCAlgorithmDES:
- moreSize = kCCBlockSizeDES;
- [dKey setLength:kCCKeySizeDES];
- break;
- case kCCAlgorithm3DES:
- moreSize = kCCBlockSize3DES;
- [dKey setLength:kCCKeySize3DES];
- break;
- case kCCAlgorithmAES128:
- moreSize = kCCBlockSizeAES128;
- [dKey setLength:kCCKeySizeAES128];
- break;
- case kCCAlgorithmCAST:
- moreSize = kCCBlockSizeCAST;
- [dKey setLength:kCCKeySizeMaxCAST];
- break;
- case kCCAlgorithmRC4:
- case kCCAlgorithmRC2:
- moreSize = kCCBlockSizeRC2;
- [dKey setLength:kCCKeySizeMaxRC2];
- break;
- default:
- return nil;
- break;
- }
- uint8_t *bufferPtr1 = NULL;
- size_t bufferPtrSize1 = 0;
- size_t movedBytes1 = 0;
- unsigned char iv[8];
- memset(iv, 0, 8);
- bufferPtrSize1 = [sTextIn length] + moreSize;
- bufferPtr1 = malloc(bufferPtrSize1);
- memset((void *)bufferPtr1, 0, bufferPtrSize1);
- // cryption....
- CCCryptorStatus ccStatus = CCCrypt(encryptOrDecrypt, // CCOperation op
- algorithm, // CCAlgorithm alg
- kCCOptionPKCS7Padding|kCCOptionECBMode, // CCOptions options
- [dKey bytes], // const void *key
- [dKey length], // size_t keyLength
- iv, // const void *iv
- [dTextIn bytes], // const void *dataIn
- [dTextIn length], // size_t dataInLength
- (void *)bufferPtr1, // void *dataOut
- bufferPtrSize1, // size_t dataOutAvailable
- &movedBytes1); // size_t *dataOutMoved
- // output situation after crypt
- switch (ccStatus) {
- case kCCSuccess:
- NSLog(@"SUCCESS");
- break;
- case kCCParamError:
- NSLog(@"PARAM ERROR");
- break;
- case kCCBufferTooSmall:
- NSLog(@"BUFFER TOO SMALL");
- break;
- case kCCMemoryFailure:
- NSLog(@"MEMORY FAILURE");
- break;
- case kCCAlignmentError:
- NSLog(@"ALIGNMENT ERROR");
- break;
- case kCCDecodeError:
- NSLog(@"DECODE ERROR");
- break;
- case kCCUnimplemented:
- NSLog(@"UNIMPLEMENTED");
- break;
- default:
- break;
- }
- if (ccStatus == kCCSuccess){
- NSData *result = [NSData dataWithBytes:bufferPtr1 length:movedBytes1];
- free(bufferPtr1);
- return result;
- }
- free(bufferPtr1);
- return nil;
- }
- + (NSData*)doCipherUse3DesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt{
- return [CryptionUseSysLib doCipher:sTextIn
- key:sKey
- Algorithm:kCCAlgorithm3DES context:encryptOrDecrypt];
- }
- + (NSData *) doCipherUseCastMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt{
- return [CryptionUseSysLib doCipher:sTextIn
- key:sKey
- Algorithm:kCCAlgorithmCAST context:encryptOrDecrypt];
- }
- + (NSData*)doCipherUseDesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt{
- return [CryptionUseSysLib doCipher:sTextIn
- key:sKey
- Algorithm:kCCAlgorithmDES
- context:encryptOrDecrypt];
- }
- + (NSData*)doCipherUseAesMethod:(NSData *)sTextIn
- key:(NSData *)sKey
- context:(CCOperation)encryptOrDecrypt{
- return [CryptionUseSysLib doCipher:sTextIn
- key:sKey
- Algorithm:kCCAlgorithmAES128
- context:encryptOrDecrypt];
- }
- + (NSString *)encodeBase64WithString:(NSString *)strData {
- return [CryptionUseSysLib encodeBase64WithData:[strData dataUsingEncoding:NSUTF8StringEncoding]];
- }
- + (NSString *)encodeBase64WithData:(NSData *)objData {
- const unsigned char * objRawData = [objData bytes];
- char * objPointer;
- char * strResult;
- // Get the Raw Data length and ensure we actually have data
- int intLength = [objData length];
- if (intLength == 0) return nil;
- // Setup the String-based Result placeholder and pointer within that placeholder
- strResult = (char *)calloc(((intLength + 2) / 3) * 4, sizeof(char));
- objPointer = strResult;
- // Iterate through everything
- while (intLength > 2) { // keep going until we have less than 24 bits
- *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
- *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
- *objPointer++ = _base64EncodingTable[((objRawData[1] & 0x0f) << 2) + (objRawData[2] >> 6)];
- *objPointer++ = _base64EncodingTable[objRawData[2] & 0x3f];
- // we just handled 3 octets (24 bits) of data
- objRawData += 3;
- intLength -= 3;
- }
- // now deal with the tail end of things
- if (intLength != 0) {
- *objPointer++ = _base64EncodingTable[objRawData[0] >> 2];
- if (intLength > 1) {
- *objPointer++ = _base64EncodingTable[((objRawData[0] & 0x03) << 4) + (objRawData[1] >> 4)];
- *objPointer++ = _base64EncodingTable[(objRawData[1] & 0x0f) << 2];
- *objPointer++ = '=';
- } else {
- *objPointer++ = _base64EncodingTable[(objRawData[0] & 0x03) << 4];
- *objPointer++ = '=';
- *objPointer++ = '=';
- }
- }
- // Terminate the string-based result
- *objPointer = '\0';
- // Return the results as an NSString object
- return [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
- }
- + (NSData *)decodeBase64WithString:(NSString *)strBase64 {
- const char * objPointer = [strBase64 cStringUsingEncoding:NSASCIIStringEncoding];
- int intLength = strlen(objPointer);
- int intCurrent;
- int i = 0, j = 0, k;
- unsigned char * objResult;
- objResult = calloc(intLength, sizeof(char));
- // Run through the whole string, converting as we go
- while ( ((intCurrent = *objPointer++) != '\0') && (intLength-- > 0) ) {
- if (intCurrent == '=') {
- if (*objPointer != '=' && ((i % 4) == 1)) {// || (intLength > 0)) {
- // the padding character is invalid at this point -- so this entire string is invalid
- free(objResult);
- return nil;
- }
- continue;
- }
- intCurrent = _base64DecodingTable[intCurrent];
- if (intCurrent == -1) {
- // we're at a whitespace -- simply skip over
- continue;
- } else if (intCurrent == -2) {
- // we're at an invalid character
- free(objResult);
- return nil;
- }
- switch (i % 4) {
- case 0:
- objResult[j] = intCurrent << 2;
- break;
- case 1:
- objResult[j++] |= intCurrent >> 4;
- objResult[j] = (intCurrent & 0x0f) << 4;
- break;
- case 2:
- objResult[j++] |= intCurrent >>2;
- objResult[j] = (intCurrent & 0x03) << 6;
- break;
- case 3:
- objResult[j++] |= intCurrent;
- break;
- }
- i++;
- }
- // mop things up if we ended on a boundary
- k = j;
- if (intCurrent == '=') {
- switch (i % 4) {
- case 1:
- // Invalid state
- free(objResult);
- return nil;
- case 2:
- k++;
- // flow through
- case 3:
- objResult[k] = 0;
- }
- }
- // Cleanup and setup the return NSData
- NSData * objData = [[[NSData alloc] initWithBytes:objResult length:j] autorelease];
- free(objResult);
- return objData;
- }
- @end
转载于:https://blog.51cto.com/clement/948107
几种常见加密算法初窥及如何选用加密算法相关推荐
- 网络安全:为大家介绍5种常见的加密算法
数据加密是将数据从可读格式转换为加扰信息的过程.这样做是为了防止窥探者读取传输中的机密数据.加密可以应用于文档.文件.消息或任何其他形式的网络通信.网络犯罪如此疯狂,数据被别人看到,甚至窃走了怎么办? ...
- Spring Cloud Bus之RabbitMQ初窥
和Spring Cloud Config一样,我们接下来要聊的Spring Cloud Bus也是微服务架构系统中的必备组件.Spring Cloud Bus可以将分布式系统的节点与轻量级消息代理链接 ...
- iOS视频直播初窥:高仿
效果图 gif1 gif2 由于licecap录制的GIF失帧太严重, 都模糊掉了, 再放两张高清截图 png1 png2 前言 今年三月份,斗鱼获腾讯领投的1亿美元融资的消息被各大平台报道转载,在电 ...
- java aspectj_初窥AspectJ
AspectJ可以说是Java中当之无愧的黑魔法.说它是黑魔法,一方面是因为它很强大,能够解决一些传统编程方法论解决不了的问题,而另一方面,它也相当的晦涩,有着比较陡峭的学习曲线. 本文将带大家探索下 ...
- 完整性校验用到常见的算法_几种常见的校验算法
素材来源:网络 编辑整理:strongerHuang UART有一个奇偶校验,CAN通信有CRC校验.Modbus.MAVlink.USB等通信协议也有校验信息. 在自定义数据存储时,有经验的工程师都 ...
- 初窥R(基本说明、获取帮助、工作空间、输入输出、包)
初窥R(基本说明.获取帮助.工作空间.输入输出.包) 本篇简要介绍使用R的一些基本概念,包括基本说明.获取帮助.工作空间.输入输出,每个知识点中都会通过一个例子来练习. 一.R基本情况说明 1.R是一 ...
- flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥
前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutte ...
- 五种常见的聚类算法总结
目录 一.关于聚类的基础描述 1.1 聚类与分类的区别 1.2 聚类的概念 1.3 聚类的步骤 二.几种常见的聚类算法 2.1 K-means聚类算法 1) K-means算法的流程: 2)K- ...
- Java中 9 种常见的 CMS GC 问题分析与解决
目录 Java中 9 种常见的 CMS GC 问题分析与解决 1. GC 1.1 引言 1.2 概览 2. GC 基础 2.1 基础概念 2.2 JVM 内存划分 2.3 分配对象 2.4 收集对象 ...
最新文章
- 【轻松学排序算法】眼睛直观感受几种常用排序算法(转)
- 安卓帧数监测软件_扬尘在线监测系统实现工地智能监控
- oracle 随机排列,oracle的随机排序
- 我该学习哪个人工智能系统
- 我的java编程之路小小总结感想
- 抖音极速版—–青龙面板
- MonkeyEye电影售票系统--系统顺序图
- 发票系统KF网络报税服务器信息,增值税发票综合服务平台操作指南及注意事项...
- WMB系列-消息流中节点监视与MM+的使用注意事项
- C# 根据主机名称获得IP
- 免费空间(免备案,无广告) 1G免费全能空间
- 解决 Word 中空格下划线居中后下划线不显示的问题
- 端口碰撞Port Knocking和单数据包授权SPA
- mysql模糊查询语句怎么不区分大小写
- 【问题】连接mysql报错errorCode 0, state 08S01
- Iphone解锁步骤
- (c++)两道关于日期相减的题目
- 推荐顶级色彩网站-灵感,调色板,工具和其他色彩资源
- 在更改计算机的设置路由器,怎么重新设置路由器密码? | 192路由网
- 游戏行业的发展前景有什么看法
热门文章
- 戴尔PowerEdge2950服务器-更换故障硬盘
- php 获取数组变量个数组的长度,php数组长度的获取方法(三个实例)
- foxmail卡顿_解决Foxmail打开提示已停止工作,报错打开查看是ntdll.dll模块问题
- 关于easyUI 中treegrid异步加载数据的问题
- 微信小程序案例 大全
- 乳腺癌病理图像分类之A Novel Architecture to Classify Histopathology Images Using CNN之二--模型代码复现
- 自助游记!!!怀念彩云之南!丽江、玉龙雪山、泸沽湖N多照片!
- tcl计算机语言,TCL语言
- [生物信息学] 寻找开放阅读框(Open Reading Frame)
- 【软考学习2】数据表示——原码 反码 补码 移码