Ⅰ 数据加密方式总结
程序开发过程中一般会遇到客户端与服务端进行数据通信,不可避免的会遇到数据安全问题。为了防止数据在网络传输中发生数据泄露,我们常常会用到数据加密。常规的数据加密方式主要有:对称加密和非对称加密。
对称加密主要有3种加密方式:DES加密、3DES加密及AES加密
如上图所述,对称加密使用同一个秘钥,先用秘钥对需要传输的明文数据进行加密,已加密的密文数据经过网络传输后,数据接收方通过同一个秘钥进行解密,将密文数据再转化成明文数据,完成数据传输过程。
但DES加密算法的安全性不够好,DES 被证明是可以破解的,明文+密钥=密文,这个公式只要知道任何两个,就可以推导出第三个在已经知道明文和对应密文的情况下,通过穷举和暴力破解是可以破解DES的。
顾名思义,3DES加密就是使用DES算法加密解密3次,由于DES加密缺乏安全性,3DES加密3次后安全性大大提高,但损失了一定的速度性能,所以慢慢被更优异的AES加密算法所取代,3DES算法可以说是DES加密和AES加密中间的过度品。
AES加解密过程和DES加解密过程类似,AES标准支持可变分组长度,分组长度可设定为32 比特的任意倍数,最小值为128 比特,最大值为256 比特,安全性大大增加,加解密速度也还可以。
RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。
同时由于RSA的私钥不用在网络上传输,避免了秘钥泄露,因此安全性能大大提高。
RSA加解密速度测试:
通过上表可以发现,RSA加密速度还比较快,但解密速度会随着加密数据的大小慢很多,加密6KB大小的数据用时0秒,解密用时1秒还可以接受。但对1M左右的数据进行解密,花费了5分多钟的时间,在实际开发过程中就会显得很慢,所以RSA算法一般用于加密数据量较小的应用场景。
Ⅱ 3des加密 密钥
Des的密钥是8个字节,但实际上只有7个用上,也就是56位。
3des是用3个或2个des密钥加密一串明文,最少112位最多168位。也就是14~21个字母或数字符号。
从安全性上来说密钥位数不足是不能加密的,但有些软件为了保证用户可用,会自动使用某种策略自动填充满,一般是重复填充或采用特定字符,如果你只填了1234作为密钥,有可能真正用于加密的密钥是123412341234123412341或者123400000000000000000类似的。
另外请注意,最好去做3des的密钥位数不是7或8,因为des的加密解密是同一个过程,这样搞在填充后实际上是只使用了一次des加密••••••还不如5位6位好••••••
如果是你编程时碰到的问题,把你的源码发来看看再说。
Ⅲ 3DES 加密解密
这个我不清楚。
给电脑上的文件加密或者文件夹加密,你可以使用超级加密3000。
超级加密3000采用国际上成熟的加密算法和安全快速的加密方法,可以有效保障数据安全!
具体操作方法:
1下载安装超级加密3000。
2 然后在需要加密的文件上单击鼠标右键选择加密。
3 在弹出的文件加密窗口中设置文件加密密码就OK了。
超级加密3000的下载地址你可以在网络上搜索超级加密3000,第一个就是。
Ⅳ 加密算法之3DES
如上图所示,首先3DES的密钥会被分成三组DES密钥k1,k2,k3,首先k1对明文进行DES加密得到cipherTxt1,接下来k2对cipherTxt1进行解密得到cipherTx2,最后是使用k3对cipherTx2进行加密得到最后的密文cipherTx3
3DES的解密过程则是其加密的过程的逆过程。首先使用k3对密文进行解密,接下来使用k2对k3解密得到的结果进行加密,最后再使用k1对k2加密后得到的结果进行解密
Ⅳ 3DES的算法介绍
3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))
Ⅵ 什么是3DES对称加密算法
DES加密经过下面的步骤
1、提供明文和密钥,将明文按照64bit分块(对应8个字节),不足8个字节的可以进行填充(填充方式多种),密钥必须为8个字节共64bit
填充方式:
当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。
* NoPadding
API或算法本身不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,可以补充\0或者空格,然后trim
* PKCS5Padding
加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8
解密后:取最后一个字节,值为m,则从数据尾部删除m个字节,剩余数据即为加密前的原文。
例如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。
* PKCS7Padding
PKCS7Padding 的填充方式和PKCS5Padding 填充方式一样。只是加密块的字节数不同。PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。
2、选择加密模式
**ECB模式** 全称Electronic Codebook模式,译为电子密码本模式
**CBC模式** 全称Cipher Block Chaining模式,译为密文分组链接模式
**CFB模式** 全称Cipher FeedBack模式,译为密文反馈模式
**OFB模式** 全称Output Feedback模式,译为输出反馈模式。
**CTR模式** 全称Counter模式,译为计数器模式。
3、开始加密明文(内部原理--加密步骤,加密算法实现不做讲解)
image
1、将分块的64bit一组组加密,示列其中一组:将此组进行初始置换(IP置换),目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
2、开始Feistel结构的16次转换,第一次转换为:右侧数据R0和子密钥经过轮函数f生成用于加密左侧数据的比特序列,与左侧数据L0异或运算,
运算结果输出为加密后的左侧L0,右侧数据则直接输出为右侧R0。由于一次Feistel轮并不会加密右侧,因此需要将上一轮输出后的左右两侧对调后才正式完成一次Feistel加密,
3、DES算法共计进行16次Feistel轮,最后一轮输出后左右两侧无需对调,每次加密的子密钥不相同,子密钥是通过秘钥计算得到的。
4、末置换是初始置换的逆过程,DES最后一轮后,左、右两半部分并未进行交换,而是两部分合并形成一个分组做为末置换的输入
DES解密经过下面的步骤
1、拿到密文和加密的密钥
2、解密:DES加密和解密的过程一致,均使用Feistel网络实现,区别仅在于解密时,密文作为输入,并逆序使用子密钥。
3、讲解密后的明文去填充 (padding)得到的即为明文
Golang实现DES加密解密
package main
import (
"fmt"
"crypto/des"
"bytes"
"crypto/cipher"
)
func main() {
var miwen,_= DESEncode([]byte("hello world"),[]byte("12345678"))
fmt.Println(miwen) // [11 42 146 232 31 180 156 225 164 50 102 170 202 234 123 129],密文:最后5位是补码
var txt,_ = DESDecode(miwen,[]byte("12345678"))
fmt.Println(txt) // [104 101 108 108 111 32 119 111 114 108 100]明码
fmt.Printf("%s",txt) // hello world
}
// 加密函数
func DESEncode(orignData, key []byte)([]byte,error){
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 明文分组,不足的部分加padding
txt := PKCS5Padding(orignData,block.BlockSize())
// 设定加密模式,为了方便,初始向量直接使用key充当了(实际项目中,最好别这么做)
blockMode := cipher.NewCBCEncrypter(block,key)
// 创建密文长度的切片,用来存放密文字节
crypted :=make([]byte,len(txt))
// 开始加密,将txt作为源,crypted作为目的切片输入
blockMode.CryptBlocks(crypted,txt)
// 将加密后的切片返回
return crypted,nil
}
// 加密所需padding
func PKCS5Padding(ciphertext []byte,size int)[]byte{
padding := size - len(ciphertext)%size
padTex := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padTex...)
}
// 解密函数
func DESDecode(cripter, key []byte) ([]byte,error) {
// 建立密码块
block ,err:=des.NewCipher(key)
if err!=nil{ return nil,err}
// 设置解密模式,加密模式和解密模式要一样
blockMode := cipher.NewCBCDecrypter(block,key)
// 设置切片长度,用来存放明文字节
originData := make([]byte,len(cripter))
// 使用解密模式解密,将解密后的明文字节放入originData 切片中
blockMode.CryptBlocks(originData,cripter)
// 去除加密的padding部分
strByt := UnPKCS5Padding(origenData)
return strByt,nil
}
// 解密所需要的Unpadding
func UnPKCS5Padding(origin []byte) []byte{
// 获取最后一位转为整型,然后根据这个整型截取掉整型数量的长度
// 若此数为5,则减掉转换明文后的最后5位,即为我们输入的明文
var last = int(origin[len(origin)-1])
return origin[:len(origin)-last]
}
注意:在设置加密模式为CBC的时候,我们需要设置一个初始化向量,这个量的意思 在对称加密算法中,如果只有一个密钥来加密数据的话,明文中的相同文字就会也会被加密成相同的密文,这样密文和明文就有完全相同的结构,容易破解,如果给一个初始化向量,第一个明文使用初始化向量混合并加密,第二个明文用第一个明文的加密后的密文与第二个明文混合加密,这样加密出来的密文的结构则完全与明文不同,更加安全可靠。CBC模式图如下
CBC
3DES
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。关于这一点,PHP中却不是这样的,只要是8byte以上就行;而Java中,要求必须是24byte以上,内部会取前24byte(相当于就是24byte)。另外,初始化向量长度是8byte(目前各个语言都是如此,不是8byte会有问题)