• 常见加密算法


    七种算法:BASE64、MD5、SHA、HMAC、RSA 、AES、ECC
     
    MD5、SHA、HMAC、RSA这四种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。
     
    一、BASE64 
    按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 
    常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
     
    主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
     
    二、MD5
    MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。
     
    通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。
     
    三、SHA
    SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。 
     
    四、HMAC
    HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
     
    五.RSA加密
    RSA非对称加密算法
    非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)
    公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密
    特点:
    非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快
    对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了
    基本加密原理:
    (1)找出两个“很大”的质数:P & Q
    (2)N = P * Q
    (3)M = (P – 1) * (Q – 1)
    (4)找出整数E,E与M互质,即除了1之外,没有其他公约数
    (5)找出整数D,使得E*D除以M余1,即 (E * D) % M = 1
    经过上述准备工作之后,可以得到:
    E是公钥,负责加密
    D是私钥,负责解密
    N负责公钥和私钥之间的联系
    加密算法,假定对X进行加密
    (X ^ E) % N = Y
    n根据费尔马小定义,根据以下公式可以完成解密操作
    (Y ^ D) % N = X
     
    但是RSA加密算法效率较差,对大型数据加密时间很长,一般用于小数据。
    常用场景:
    分部要给总部发一段报文,先对报文整个进行MD5得到一个报文摘要,再对这个报文摘要用公钥加密。然后把报文和这个RSA密文一起发过去。
    总部接收到报文之后要先确定报文是否在中途被人篡改,就先把这个密文用私钥解密得到报文摘要,再和整个报文MD5一下得到的报文摘要进行对比 如果一样就是没被改过。
     
    六、AES
    AES是开发中常用的加密算法之一。然而由于前后端开发使用的语言不统一,导致经常出现前端加密而后端不能解密的情况出现。然而无论什么语言系统,AES的算法总是相同的, 因此导致结果不一致的原因在于 加密设置的参数不一致 。于是先来看看在两个平台使用AES加密时需要统一的几个参数。
    密钥长度(Key Size) 加密模式(Cipher Mode) 填充方式(Padding) 初始向量(Initialization Vector)
    密钥长度
    AES算法下,key的长度有三种:128、192和256 bits。由于历史原因,JDK默认只支持不大于128 bits的密钥,而128 bits的key已能够满足商用安全需求。因此本例先使用AES-128。(Java使用大于128 bits的key方法在文末提及)
    加密模式
    AES属于块加密(Block Cipher),块加密中有CBC、ECB、CTR、OFB、CFB等几种工作模式。本例统一使用CBC模式。
    填充方式
    由于块加密只能对特定长度的数据块进行加密,因此CBC、ECB模式需要在最后一数据块加密前进行数据填充。(CFB,OFB和CTR模式由于与key进行加密操作的是上一块加密后的密文,因此不需要对最后一段明文进行填充)
    iOS SDK中提供了PKCS7Padding,而JDK则提供了PKCS5Padding。原则上PKCS5Padding限制了填充的Block Size为8 bytes,而Java实际上当块大于该值时,其PKCS5Padding与PKCS7Padding是相等的:每需要填充χ个字节,填充的值就是χ。 
    初始向量
    使用除ECB以外的其他加密模式均需要传入一个初始向量,其大小与Block Size相等(AES的Block Size为128 bits),而两个平台的API文档均指明当不传入初始向量时,系统将默认使用一个全0的初始向量。
    有了上述的基础之后,可以开始分别在两个平台进行实现了。
    iOS实现
    先定义一个初始向量的值。
    NSString *const kInitVector = @"16-Bytes--String";
    确定密钥长度,这里选择 AES-128。
    size_t const kKeySize = kCCKeySizeAES128;
     
    七、ECC
    ECC是EllipticCurves Cryptography的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。
    ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高,它的破译或求解难度基本上是指数级的,黑客很难用通常使用的暴力破解的方法来破解。RSA算法的特点之一是数学原理相对简单,在工程应用中比较易于实现,但它的单位安全强度相对较低。因此,ECC算法的可以用较少的计算能力提供比RSA加密算法更高的安全强度,有效地解决了“提高安全强度必须增加密钥长度”的工程实现问题。
     
    与RSA算法相比,ECC算法拥有突出优势:
    1、更适合于移动互联网:ECC加密算法的密钥长度很短(256位),意味着占用更少的存储空间,更低的CPU开销和占用更少的带宽。随着越来越多的用户使用移动设备来完成各种网上活动,ECC加密算法为移动互联网安全提供更好的客户体验。
    2、更好的安全性:ECC加密算法提供更强的保护,比目前的其他加密算法能更好的防止攻击,使你的网站和基础设施比用传统的加密方法更安全,为移动互联网安全提供更好的保障。
    3、更好的性能: ECC加密算法需要较短的密钥长度来提供更好的安全,例如,256位的ECC密钥加密强度等同于3072位RSA密钥的水平(目前普通使用的RSA密钥长度是2048位)。其结果是你以更低的计算能力代价得到了更高的安全性。经国外有关权威机构测试,在Apache和IIS服务器采用ECC算法,Web服务器响应时间比RSA快十几倍。
    4、更大的IT投资回报:ECC可帮助保护您的基础设施的投资,提供更高的安全性,并快速处理爆炸增长的移动设备的安全连接。 ECC的密钥长度增加速度比其他的加密方法都慢(一般按128位增长,而 RSA则是倍数增长,如:1024 –2048--4096),将延长您现有硬件的使用寿命,让您的投资带来更大的回报。
     
    ECC加密算法的通用性不断增强
    ECC加密算法自1985年提出,因其工程应用中难度较高,到2005年才在各种操作系统中获得广泛支持,在全球安全市场需求的刺激下,ECC算法将逐步取代RSA算法,成为主流加密算法。目前,全球各大CA都已经陆续开始为用户签发采用ECC加密算法的各种证书,沃通全球率先支持中文。经沃通大量测试,ECC加密算法以后支持所有操作系统、所有浏览器和各种移动终端,主要有:
    Mozilla NSS 3.11以上版本支持
    OpenSSL 1.0以上版本支持
    微软CryptoAPI Vista/Win7/Win8都支持
    BouncyCastle 1.32以上版本支持
    JSSE 6 以上版本支持
    BSAFE 4.0 以上版本支持
    各种版本的IE浏览器、火狐浏览器、谷歌浏览器和苹果浏览器都支持
    安卓系统(2.1以上版本)、苹果iOS(5.0以上版本) 、WindowPhone(各种版本)都支持
    也就是说:沃通签发的采用ECC加密算法的各种数字证书(SSL证书、代码签名证书及客户端证书),无论是PC终端还是各种移动设备都能很好地支持。
  • 相关阅读:
    .NET 事件模型教程(一)
    [转帖]Predicate的用法
    MSBuild入门(续)
    浅析C# 中object sender与EventArgs e
    调用一个按钮的Click事件(利用反射)
    Delegate,Action,Func,匿名方法,匿名委托,事件
    投票系统如何防止一个用户多次投票
    如何发送表单
    SharePoint NLB选Unicast还是选Multicast?
    为SharePoint的多台WFE配置Windows自带的NLB遇到的一个问题
  • 原文地址:https://www.cnblogs.com/fendou0320/p/6523311.html
Copyright © 2020-2023  润新知