导航:首页 > 文档加密 > 用对称加密对信息加密

用对称加密对信息加密

发布时间:2023-04-02 10:11:26

㈠ OC对称加密-AES加密/解密

通常采用同一个秘钥进行信息的加密和解密操作,称为单秘钥加密,也称为对称加密。

这里介绍其中一种对称加密算法 -- AES,采用唯一的key进行加野态密和解密
对称加密的优点:
算法公开,计算量小,加密速度快,加密效率高。
缺点:
双方使用相枯亏同的钥匙,安全性得不到保证。
使用对称加密需要注意的是秘钥的保密性,并且秘钥要求定期更换

写没脊神一个NSString分类,NSString+wxAES.h:

NSString+wxAES.m:

使用示例:

打印结果为:

㈡ 非对称加密和对称加密

非对称加密和对称加密在加密和解密过程、加密解密速度、传输的安全性上都有所不同,具体介绍如下:

1、加密和解密过程不同

对称加密过程和解密过程使用的同一个密钥,加密过程相当于用原文+密钥可以传输出密文,同时解密过程用密文-密钥可以推导出原文。但非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密。

2、加密解密速度不同

对称加密解密的速度比较快,适合数据比较长时的使用。非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。

3、传输的安全性不同

对称加密的过程中无法确保密钥被安全传递,密文在传输过程中是可能被第三方截获的,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,安全性相对较低。

非对称加密算法中私钥是基于不同的算法生成不同的随机数,私钥通过一定的加密算法推导出公钥,但私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。所以安全性较高。

一、对称加密算法

     指加密和解密使用相同密钥的加密算法。对称加密算法用来对敏感数据等信息进行加密,常用的算法包括DES、3DES、AES、DESX、Blowfish、、RC4、RC5、RC6。

     DES(Data Encryption Standard) :数据加密标准,速度较快,适用于加密大量数据的场合。

     3DES(Triple DES) :是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

     AES(Advanced Encryption Standard) :高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

二、非对称加密算法

      指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。

        RSA: 由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

        DSA(Digital Signature Algorithm) :数字签名算法,是一种标准的 DSS(数字签名标准);

        ECC(Elliptic Curves Cryptography) :椭圆曲线密码编码学。

ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面:

(1)抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。

(2)计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。

(3)存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。

(4)带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

三、散列算法(Hash算法---单向加密算法)

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

Hash算法: 特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

单向散列函数一般用于产生消息摘要,密钥加密等,常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。

       MD5(Message Digest Algorithm 5): 是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。

       SHA(Secure Hash Algorithm): 可以对任意长度的数据运算生成一个160位的数值;

       SHA-1与MD5的比较

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

(1)对强行供给的安全性:最显着和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^(128)数量级的操作,而对SHA-1则是2^(160)数量级的操作。这样,SHA-1对强行攻击有更大的强度。

(2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

四、 加密算法的选择

1.由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

2.对称加密算法不能实现签名,因此签名只能非对称算法。

3.由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

4.在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

         那采用多少位的密钥呢?

         RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

㈢ 2019-06-10 对称加密 和非对称加密

一、对称加密

AES加密

AES加密是一种高级加密标准,是一种区块加密标准。它是一个对称密码,就是说加密和解密用相同的密钥。WPA/WPA2经常用的加密方式就是AES加密算法。

二、非对称加密

RSA加密算法是一种非对称加密算法,非对称加密算法需要两个密钥:公共密钥和私有密钥。公钥和私钥是配对的,用公钥加密的数据只有配对的私钥才能解密。

RSA对加密数据的长度有限制,一般为密钥的长度值-11,要加密较长的数据,可以采用数据截取的方法,分段加密。

使用场景:

文件或数据在本地使用公钥或私钥加密,加密后的数据传送到服务器,服务器使用同一套密钥中的私钥或者公钥进行解密。

一、Https是什么?

1.HTTPS概念

HTTPS并不是一个单独的协议,而是对工作在一加密连接(SSL/TLS)上的常规HTTP协议。通过在TCP和HTTP之间加入TLS来加密。

2.SSL/TLS协议

SSL协议,是一种安全传输的协议,TLS是SSL v3.0的升级版。

4.HTTPS传输速度

1)通信慢

2)SSL必须进行加密处理,比HTTP消耗更多资源

二、TLS/SSL握手

1.密码学原理

1)对称加密

加密数据用的秘钥和解密数据用的密钥是一样的。

2)不对称加密

私有密钥:一方保管

共有密钥:双方公有

RSA算法。

2.数字证书

1)就是互联网通讯中标志通讯各方身份信息的一串数字,也是一个文件。

2)为什么有数字证书?

3)数字证书的颁发过程?

3.SSL与TLS握手的过程?

使用非对称加密,随机数不能被随便破解

Https双向认证的流程:

a. 客户端向服务端发送SSL版本等信息

b. 服务端给客户端返回SSL版本,同时也返回服务器端的证书

c.  客户端使用服务的返回的信息验证服务器的合法性,

a) 包括:证书是否过期,发型服务器证书的CA是否可靠,返回的公钥能正确解开返回证书中的数字签名,服务器证书上帝域名是否和服务器的实际域名想匹配

b) 验证通过后,将进行通信,否则终止通信

d. 客户端将自己的证书和公钥发送给服务端

e. 验证客户端的证书,通过验证后,会获得客户端的公钥

f. 客户端向服务端发送自己可以支持的对称加密方案给服务端,让服务端进行选择

g. 服务端在客户端提供的加密方案中选择加密程度高的加密方式

h. 将加密方案通过使用之前获取到的公钥进行加密,返回给客户端

i. 客户端收到服务端返回的加密方案后,使用自己的私钥进行解密,获取具体的加密方式,最后,产生加密方式的随机码,用作过程中的密钥,使用之前从客户端证书中获取到的公钥进行加密后,发送嘿服务端

j. 服务端收到客户端发来的消息后,使用私钥对加密信息进行加密,获得对称加密的密钥

k. 对称加密,确保通信安全

总结:https实际上就是在TCP层与http层之间加入了SSL/TLS来为上层的安全保驾护航,主要用到了对称加密,非对称加密,证书等技术进行客户端与服务器的数据加密传输,最终达到保证整个通信的安全性。

㈣ 密码学基础(二):对称加密

加密和解密使用相同的秘钥称为对称加密。

DES:已经淘汰
3DES:相对于DES有所加强,但是仍然存在较大风险
AES:全新的对称加密算法。

特点决定使用场景,对称加密拥有如下特点:

速度快,可用于频率很高的加密场景。

使用同一个秘钥进行加密和解密。

可选按照128、192、256位为一组的加密方式,加密后的输出值为所选分组位数的倍数。密钥的长度不同,推荐加密轮数也不同,加密强度也更强。

例如:
AES加密结果的长度由原字符串长度决定:一个字符为1byte=4bit,一个字符串为n+1byte,因为最后一位为'',所以当字符串长度小于等于15时,AES128得到的16进制结果为32位,也就是32 4=128byte,当长度超过15时,就是64位为128 2byte。

因为对称加密速度快的特点,对称加密被广泛运用在各种加密场所中。但是因为其需要传递秘钥,一旦秘钥被截获或者泄露,其加密就会玩完全破解,所以AES一般和RSA一起使用。

因为RSA不用传递秘钥,加密速度慢,所以一般使用RSA加密AES中锁使用的秘钥后,再传递秘钥,保证秘钥的安全。秘钥安全传递成功后,一直使用AES对会话中的信息进行加密,以此来解决AES和RSA的缺点并完美发挥两者的优点,其中相对经典的例子就是HTTPS加密,后文会专门研究。

本文针对ECB模式下的AES算法进行大概讲解,针对每一步的详细算法不再该文讨论范围内。

128位的明文被分成16个字节的明文矩阵,然后将明文矩阵转化成状态矩阵,以“abcdefghijklmnop”的明文为例:

同样的,128位密钥被分成16组的状态矩阵。与明文不同的是,密文会以列为单位,生成最初的4x8x4=128的秘钥,也就是一个组中有4个元素,每个元素由每列中的4个秘钥叠加而成,其中矩阵中的每个秘钥为1个字节也就是8位。

生成初始的w[0]、w[1]、w[2]、w[3]原始密钥之后,通过密钥编排函数,该密钥矩阵被扩展成一个44个组成的序列W[0],W[1], … ,W[43]。该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加,后面40个字分为10组,每组4个32位的字段组成,总共为128位,分别用于10轮加密运算中的轮密钥加密,如下图所示:

之所以把这一步单独提出来,是因为ECB和CBC模式中主要的区别就在这一步。

ECB模式中,初始秘钥扩展后生成秘钥组后(w0-w43),明文根据当前轮数取出w[i,i+3]进行加密操作。

CBC模式中,则使用前一轮的密文(明文加密之后的值)和当前的明文进行异或操作之后再进行加密操作。如图所示:

根据不同位数分组,官方推荐的加密轮数:

轮操作加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。

当第一组加密完成时,后面的组循环进行加密操作知道所有的组都完成加密操作。

一般会将结果转化成base64位,此时在iOS中应该使用base64编码的方式进行解码操作,而不是UTF-8。

base64是一种编码方式,常用语传输8bit字节码。其编码原理如下所示:

将原数据按照3个字节取为一组,即为3x8=24位

将3x8=24的数据分为4x6=24的数据,也就是分为了4组

将4个组中的数据分别在高位补上2个0,也就成了8x4=32,所以原数据增大了三分之一。

根据base64编码表对数据进行转换,如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办,Base64用x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

举个栗子:Man最后的结果就是TWFu。

计算机中所有的数据都是以0和1的二进制来存储,而所有的文字都是通过ascii表转化而来进而显示成对应的语言。但是ascii表中存在许多不可见字符,这些不可见字符在数据传输时,有可能经过不同硬件上各种类型的路由,在转义时容易发生错误,所以规定了64个可见字符(a-z、A-Z、0-9、+、/),通过base64转码之后,所有的二进制数据都是可见的。

ECB和CBC是两种加密工作模式。其相同点都是在开始轮加密之前,将明文和密文按照128/192/256进行分组。以128位为例,明文和密文都分为16组,每组1个字节为8位。

ECB工作模式中,每一组的明文和密文相互独立,每一组的明文通过对应该组的密文加密后生成密文,不影响其他组。

CBC工作模式中,后一组的明文在加密之前先使用前一组的密文进行异或运算后再和对应该组的密文进行加密操作生成密文。

为简单的分组加密。将明文和密文分成若干组后,使用密文对明文进行加密生成密文
CBC

加密:

解密:

㈤ 简要说说对称加密和非对称加密的原理以及区别是什么

对称加密的原理是数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。

非对称加密的原理是甲方首先生成一对密钥同时将其中的一把作为公开密钥;得到公开密钥的乙方再使用该密钥对需要加密的信息进行加密后再发送给甲方;甲方再使用哪键另一把对应的私有密钥对加密后的信息进行解密,这样就实现了机密数据传输。

对称加密和非对称加密的区别为:密钥不同、安全性不同、数字签名不同。

一、密钥不同

1、对称加密:对称加密加密和解密使用同一个密钥。

2、非对称加密:非对称加密加密和解密所使用的不是同一个密钥,需要两个密钥来进行加密和解密。

二、安全性不同

1、对基缓销称加密:对称加密如果用于通过网络传输加密文件,那么不管使用任何方法将密钥告诉对方,都有可能被窃听。

2、非对称加密:非对称加密因为它包含有两个密钥,且仅有其中的“公钥”是可以被公开的,接收方只需要使用自己已持有的私钥进行解密,这样就可以很好的避免密钥在传输过程中产生的安全问题。

三搏游、数字签名不同

1、对称加密:对称加密不可以用于数字签名和数字鉴别。

2、非对称加密:非对称加密可以用于数字签名和数字鉴别。

㈥ 对称加密算法介绍 关于对称加密算法简介

1、对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。

2、对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。

㈦ 对称加密、非对称加密、RSA(总结)

指的就是加、解密使用的同是一串密钥,所以被称做对称加密。对称加密只有一个密钥作为私钥。 常见的对称加密算法:DES,AES等。

指的是加、解密使用不同的密钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。反之,私钥加密的信息,只有公钥才能解密。 举个例子,你向某公司服务器请求公钥,服务器将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人才能对你的消息解密。与对称加密不同的是,公司服务器不需要将私钥通过网络发送出去,因此安全性大大提高。最常用的非对称加密算法:

对称加密相比非对称加密算法来说,加解密的效率要高得多、加密速度快。但是缺陷在于对于密钥的管理和分发上比较困难,不是非常安全,密钥管理负担很重。

安全性更高,公钥是公开的,密钥是自己保存的,不需要将私钥给别人。缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

安全肯定是非对称加密安全,但是效率比较慢,对称加密效率高,但是不安全。严谨一点的做法是混合起来使用,将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。实际工作中直接使用非对称加、解密其实也可以,因为我们平时一般请求的报文不会很大,加解密起来速度在可接受范围内,或者可以对敏感字段,比如密码、手机号、身份证号等进行分段加密,效率还可以。

㈧ 加密方式有几种

加密方式的种类:

1、MD5

一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。

2、对称加密

对称加密采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

3、非对称加密

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。

如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

(8)用对称加密对信息加密扩展阅读

非对称加密工作过程

1、乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。

2、得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。

3、乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。

在传输过程中,即使攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。

同样,如果乙要回复加密信息给甲,那么需要甲先公布甲的公钥给乙用于加密,甲自己保存甲的私钥用于解密。

㈨ 科普知识—对称加密和非对称加密

区块链技术中广泛应用到非对称加密技术,非对称加密技术保证了信息在传输过程中的安全性,非对称加密技术是在对称加密技术上发展来的。本文主要阐述对称加密技术和非对称加密技术的概念和特点,并举例说明。

对称加密就是用相同的密钥对原文进行加密和解密,通信双方共用一个密钥。

基于对称加密算法传输信息“ABC”的步骤。

(1)发送方通过密钥对原文"ABC"进行加密,得到密文"abc",并发送给接收方。密钥为将字母转换为对应的小写字母,大写A转换为小写a,“BC”同理转换为“bc”。

(2)发送方将密钥发送给接收方。

(3)接收方通过密钥对密文进行解密,反推出原文“ABC”。

对称加密算法的缺点:无法确保密钥被安全传递。

密钥就是传说中的“密码本”。密文在传输过程中是可能被第三方截获的,关键就落在“密码本”上,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,所以经常看到电影、电视剧的情节中通过各种手段保护密码本的安全送达。

非对称加密技术很好的解决了对称加密技术密钥无法安全传递的问题。

非对称加密有两个密钥,即公钥(Public Key)和私钥(Private Key),对数据进行加密和解密使用不同的密钥。使用公钥进行加密,使用私钥进行解密。

非对称加密算法中私钥就是一个随机数,基于不同的算法生成不同的随机数,如:SHA256算法生成的是256位的随机数,通常是调用操作系统的随机数生成器来生成私钥,私钥通过一定的加密算法推导出公钥,私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。

基于非对称加密算法传输信息“hello world”的步骤。

(1)发送方使用接收方的公钥对待发送信息“hello world”加密,此处需注意:信息发送给谁,使用谁的公钥进行加密,公钥是可以公开的,类似于银行卡账户。

(2)发送方将加密后的密文通过网络发送给接收方。

(3)接收方接收到密文后,使用自己的私钥对密文进行解密,从而获得传输信息“hello world”。

采用非对称加密算法即使第三方在网络上截获到密文,但其无法获得接收方的私钥,也就无法对密文进行解密,作为接收方务必保证自己私钥的安全,所以非对称加密技术解决了密钥传输过程的安全性问题。

本文主要阐述对称加密技术和非对称加密技术的概念和特点,并举例说明。对称加密是通信双方共用密钥,无法保证密钥的安全传递;非对称加密使用接收方的公钥对数据加密,接收方使用自己的私钥解密,即使信息被第三方截获,由于没有接收方的私钥,也无法破解密文。

㈩ 对称加密算法以及使用方法

加密的原因:保证数据安全

加密必备要素:1、明文/密文    2、秘钥    3、算法

秘钥:在密码学中是一个定长的字符串、需要根据加密算法确定其长度

加密算法解密算法一般互逆、也可能相同

常用的两种加密方式:

对称加密:秘钥:加密解密使用同一个密钥、数据的机密性双向保证、加密效率高、适合加密于大数据大文件、加密强度不高(相对于非对称加密)

非对称加密:秘钥:加密解密使用的不同秘钥、有两个密钥、需要使用密钥生成算法生成两个秘钥、数据的机密性只能单向加密、如果想解决这个问题、双向都需要各自有一对秘钥、加密效率低、加密强度高

                    公钥:可以公开出来的密钥、公钥加密私钥解密

                    私钥:需要自己妥善保管、不能公开、私钥加密公钥解密

安全程度高:多次加密

按位异或运算

凯撒密码:加密方式    通过将铭文所使用的字母表按照一定的字数平移来进行加密

mod:取余

加密三要素:明文/密文(字母)、秘钥(3)、算法(向右平移3/-3)

安全常识:不要使用自己研发的算法、不要钻牛角尖、没必要研究底层实现、了解怎么应用;低强度的密码比不进行任何加密更危险;任何密码都会被破解;密码只是信息安全的一部分

保证数据的机密性、完整性、认证、不可否认性

计算机操作对象不是文字、而是由0或1排列而成的比特序列、程序存储在磁盘是二进制的字符串、为比特序列、将现实的东西映射为比特序列的操作称为编码、加密又称之为编码、解密称之为解码、根据ASCII对照表找到对应的数字、转换成二进制

三种对称加密算法:DES\3DES\ AES  

DES:已经被破解、除了用它来解密以前的明文、不再使用

密钥长度为56bit/8、为7byte、每隔7个bit会设置一个用于错误检查的比特、因此实际上是64bit

分组密码(以组为单位进行处理):加密时是按照一个单位进行加密(8个字节/64bit为一组)、每一组结合秘钥通过加密算法得到密文、加密后的长度不变

3DES:三重DES为了增加DES的强度、将DES重复三次所得到的一种加密算法   密钥长度24byte、分成三份  加密--解密--加密 目的:为了兼容DES、秘钥1秘钥2相同==三个秘钥相同  ---加密一次        密钥1秘钥3相同--加密三次    三个密钥不相同最好、此时解密相当于加密、中间的一次解密是为了有三个密钥相同的情况

此时的解密操作与加密操作互逆,安全、效率低

数据先解密后加密可以么?可以、解密相当于加密、加密解密说的是算法

AES:(首选推荐)底层算法为Rijndael   分组长度为128bit、密钥长度为128bit到256bit范围内就可以   但是在AES中、密钥长度只有128bit\192bit\256bit     在go提供的接口中、只能是16字节(128bit)、其他语言中秘钥可以选择

目前为止最安全的、效率高

底层算法

分组密码的模式:

按位异或、对数据进行位运算、先将数据转换成二进制、按位异或操作符^、相同为真、不同为假、非0为假    按位异或一次为加密操作、按位异或两次为解密操作:a和b按位异或一次、结果再和b按位异或

ECB : 如果明文有规律、加密后的密文有规律不安全、go里不提供该接口、明文分组分成固定大小的块、如果最后一个分组不满足分组长度、则需要补位

CBC:密码链

问题:如何对字符串进行按位异或?解决了ECB的规律可查缺点、但是他不能并行处理、最后一个明文分组也需要填充 、初始化向量长度与分组长度相同

CFB:密文反馈模式

不需要填充最后一个分组、对密文进行加密

OFB:

不需要对最后一组进行填充

CTR计数器:

不需要对最后一组进行填充、不需要初始化向量     

Go中的实现

官方文档中:

在创建aes或者是des接口时都是调用如下的方法、返回的block为一个接口

func NewCipher(key [] byte ) ( cipher . Block , error )

type Block interface {

    // 返回加密字节块的大小

    BlockSize() int

    // 加密src的第一块数据并写入dst,src和dst可指向同一内存地址

    Encrypt(dst, src []byte)

    // 解密src的第一块数据并写入dst,src和dst可指向同一内存地址

    Decrypt(dst, src []byte)

}

Block接口代表一个使用特定密钥的底层块加/解密器。它提供了加密和解密独立数据块的能力。

Block的Encrypt/Decrypt也能进行加密、但是只能加密第一组、因为aes的密钥长度为16、所以进行操作的第一组数据长度也是16

如果分组模式选择的是cbc

func NewCBCEncrypter(b Block, iv []byte) BlockMode    加密

func NewCBCDecrypter(b Block, iv []byte) BlockMode    解密

加密解密都调用同一个方法CryptBlocks()

并且cbc分组模式都会遇到明文最后一个分组的补充、所以会用到加密字节的大小

返回一个密码分组链接模式的、底层用b加密的BlockMode接口,初始向量iv的长度必须等于b的块尺寸。iv自己定义

返回的BlockMode同样也是一个接口类型

type BlockMode interface {

    // 返回加密字节块的大小

    BlockSize() int

    // 加密或解密连续的数据块,src的尺寸必须是块大小的整数倍,src和dst可指向同一内存地址

    CryptBlocks(dst, src []byte)

}

BlockMode接口代表一个工作在块模式(如CBC、ECB等)的加/解密器

返回的BlockMode其实是一个cbc的指针类型中的b和iv

# 加密流程: 

1. 创建一个底层使用des/3des/aes的密码接口 "crypto/des" func NewCipher(key []byte) (cipher.Block, error) # -- des func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des "crypto/aes" func NewCipher(key []byte) (cipher.Block, error) # == aes 

2. 如果使用的是cbc/ecb分组模式需要对明文分组进行填充

3. 创建一个密码分组模式的接口对象 - cbc func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密 - cfb func NewCFBEncrypter(block Block, iv []byte) Stream # 加密 - ofb - ctr

 4. 加密, 得到密文

流程:

填充明文:

先求出最后一组中的字节数、创建新切片、长度为新切片、值也为切片的长度、然后利用bytes.Reapet将长度换成字节切片、追加到原明文中

//明文补充

func padPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、求出需要填充的个数

    padNum := blockSize-len(plaintText) % blockSize

    //2、对填充的个数进行操作、与原明文进行合并

    newPadding := []byte{byte(padNum)}

    newPlain := bytes.Repeat(newPadding,padNum)

    plaintText = append(plaintText,newPlain...)

    return plaintText

}

去掉填充数据:

拿去切片中的最后一个字节、得到尾部填充的字节个数、截取返回

//解密后的明文曲调补充的地方

func createPlaintText(plaintText []byte,blockSize int)[]byte{

    //1、得到最后一个字节、并将字节转换成数字、去掉明文中此数字大小的字节

    padNum := int(plaintText[len(plaintText)-1])

    newPadding := plaintText[:len(plaintText)-padNum]

    return newPadding

}

des加密:

1、创建一个底层使用des的密码接口、参数为秘钥、返回一个接口

2、对明文进行填充

3、创建一个cbc模式的接口、需要创建iv初始化向量、返回一个blockmode对象

4、加密、调用blockmode中的cryptBlock函数进行加密、参数为目标参数和源参数

//des利用分组模式cbc进行加密

func EncryptoText(plaintText []byte,key []byte)[]byte{

    //1、创建des对象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、对明文进行填充

    newText := padPlaintText(plaintText,cipherBlock.BlockSize())

    //3、选择分组模式、其中向量的长度必须与分组长度相同

    iv := make([]byte,cipherBlock.BlockSize())

    blockMode := cipher.NewCBCEncrypter(cipherBlock,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

des解密:

1、创建一个底层使用des的密码接口、参数为秘钥、返回一个接口

2、创建一个cbc模式的接口、需要创建iv初始化向量,返回一个blockmode对象

3、加密、调用blockmode中的cryptBlock函数进行解密、参数为目标参数和源参数

4、调用去掉填充数据的方法

//des利用分组模式cbc进行解密

func DecryptoText(cipherText []byte, key []byte)[]byte{

    //1、创建des对象

    cipherBlock,err := des.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建cbc分组模式接口

    iv := []byte("12345678")

    blockMode := cipher.NewCBCDecrypter(cipherBlock,iv)

    //3、解密

    blockMode.CryptBlocks(cipherText,cipherText)

    //4、将解密后的数据进行去除填充的数据

    newText := clearPlaintText(cipherText,cipherBlock.BlockSize())

    return newText

}

Main函数调用

func main(){

    //需要进行加密的明文

    plaintText := []byte("CBC--密文没有规律、经常使用的加密方式,最后一个分组需要填充,需要初始化向量" +

        "(一个数组、数组的长度与明文分组相等、数据来源:负责加密的人提供,加解密使用的初始化向量必须相同)")

    //密钥Key的长度需要与分组长度相同、且加密解密的密钥相同

    key := []byte("1234abcd")

    //调用加密函数

    cipherText := EncryptoText(plaintText,key)

    newPlaintText := DecryptoText(cipherText,key)

    fmt.Println(string(newPlaintText))

}

AES加密解密相同、所以只需要调用一次方法就可以加密、调用两次则解密

推荐是用分组模式:cbc、ctr

aes利用分组模式cbc进行加密

//对明文进行补充

func paddingPlaintText(plaintText []byte , blockSize int ) []byte {

    //1、求出分组余数

    padNum := blockSize - len(plaintText) % blockSize

    //2、将余数转换为字节切片、然后利用bytes.Repeat得出有该余数的大小的字节切片

    padByte := bytes.Repeat([]byte{byte(padNum)},padNum)

    //3、将补充的字节切片添加到原明文中

    plaintText = append(plaintText,padByte...)

    return plaintText

}

//aes加密

func encryptionText(plaintText []byte, key []byte) []byte {

    //1、创建aes对象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、明文补充

    newText := paddingPlaintText(plaintText,block.BlockSize())

    //3、创建cbc对象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCEncrypter(block,iv)

    //4、加密

    blockMode.CryptBlocks(newText,newText)

    return newText

}

//解密后的去尾

func clearplaintText(plaintText []byte, blockSize int) []byte {

    //1、得到最后一个字节、并转换成整型数据

    padNum := int(plaintText[len(plaintText)-1])

    //2、截取明文字节中去掉得到的整型数据之前的数据、此处出错、没有用len-padNum

    newText := plaintText[:len(plaintText)-padNum]

    return newText

}

//aes解密

func deCryptionText(crypherText []byte, key []byte ) []byte {

    //1、创建aes对象

    block, err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建cbc对象

    iv := []byte("12345678abcdefgh")

    blockMode := cipher.NewCBCDecrypter(block,iv)

    //3、解密

    blockMode.CryptBlocks(crypherText,crypherText)

    //4、去尾

    newText := clearplaintText(crypherText,block.BlockSize())

    return newText

}

func main(){

    //需要进行加密的明文

    plaintText := []byte("CBC--密文没有规律、经常使用的加密方式,最后一个分组需要填充,需要初始化向量")

    //密钥Key的长度需要与分组长度相同、且加密解密的密钥相同

    key := []byte("12345678abcdefgh")

    //调用加密函数

    cipherText := encryptionText(plaintText,key)

    //调用解密函数

    newPlaintText := deCryptionText(cipherText,key)

    fmt.Println("解密后",string(newPlaintText))

}

//aes--ctr加密

func encryptionCtrText(plaintText []byte, key []byte) []byte {

    //1、创建aes对象

    block,err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }

    //2、创建ctr对象,虽然ctr模式不需要iv,但是go中使用ctr时还是需要iv

    iv := []byte("12345678abcdefgh")

    stream := cipher.NewCTR(block,iv)

    stream.XORKeyStream(plaintText,plaintText)

    return plaintText

}

func main() {

//aes--ctr加密解密、调用两次即为解密、因为加密解密函数相同stream.XORKeyStream

    ctrcipherText := encryptionCtrText(plaintText, key)

    ctrPlaintText := encryptionCtrText(ctrcipherText,key)

    fmt.Println("aes解密后", string(ctrPlaintText))

}

英文单词:

明文:plaintext     密文:ciphertext   填充:padding/fill    去掉clear  加密Encryption  解密Decryption

阅读全文

与用对称加密对信息加密相关的资料

热点内容
python九乘法表怎么编写 浏览:972
思维方式pdf 浏览:654
tcc社区app怎么注册 浏览:937
央视网下载加密 浏览:452
命令行访问服务器 浏览:36
梁加密区箍筋是不是必须封闭箍筋 浏览:760
在百度地图如何定位服务器地址 浏览:570
单片机计数器中断 浏览:296
哈啰安装文件夹名称 浏览:294
解压视频声控用杯子玩泡沫 浏览:740
19年的普通安卓机怎么样了 浏览:604
如何在app上刷导游题目 浏览:861
子弹解压视频大全 浏览:323
鸿蒙加密等级 浏览:806
cocos2dluapdf 浏览:493
假的加密锁靠谱吗 浏览:176
经营圣手服务器怎么调 浏览:749
arduino手机编程 浏览:481
西医pdf下载 浏览:29
后浪电影学院pdf 浏览:813