对称加密一:DES&go实现

密码技术###

1. 介绍

1.1 加密/解密三要素: 明文/ 密文, 秘钥, 密码算法
  • 明文/密文:
    加密之前的消息称为明文(plaintext),加密之后的消息称为密文(cipher-text)。
  • 秘钥 :

密码算法中需要密钥(key)。现实世界中的“钥'',是像 :key: 这样的形状微妙而复杂的小金属片。然而,密码算法中的密钥,则是像203554728568477650354673080689430768这样的一串非常大的数字。

  • 密码算法 :

用于解决复杂问题的步骤,通常称为算法(algorithm)。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法",而解密的步骤则称为“解密算法"。加密、解密的算法合在一起统称为密码算法。

1.2密码信息威胁

我们将信息安全所面临的威胁与用来用对这些威胁的密码技术直接的关系用一张图标来表示出来。


2. 对称加密

对称加密: 也称为对称密码, 是指在加密和解码时使用同一秘钥的加密方式

2.1 DES:

DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS46.3)。DES一直以来被美国以及其他国家的政府和银行等广泛使用。然而,随着计算机的进步,现在DES已经能够被暴力破解,强度大不如前了(不建议使用)

  • DES加密解密

DES是一种将64比特的明文加密成64比特的密文的对称密码算法,==它的密钥长度是56比特==。尽管从规格上来说,DES的密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实质上其密钥长度是56比特。

DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码(blockcipher),DES就是分组密码的一种。

DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。

秘钥长度(56bit + 8bit)/8 = 8byte


DES图例
  • 三重DES加密

现在DES已经可以在现实的时间内被暴力破解,三重DES(triple-DES)是为了增加DES的强度,==将DES重复3次所得到的一种密码算法==,通常缩写为3DES

3DES

明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是56×3=168比特, 加上用于错误检测的标志位8x3, 共192bit。

从上图我们可以发现,三重DES并不是进行三次DES加密(加密-->加密-->加密),而是加密-->解密-->加密的过程。在加密算法中加人解密操作让人感觉很不可思议,实际上这个方法是IBM公司设计出来的,目的是为了让三重DES能够兼容普通的DES。

当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了。这是因为在前两步加密-->解密之后,得到的就是最初的明文。因此,以前用DES加密的密文,就可以通过这种方式用三重DES来进行解密。也就是说,三重DES对DES具备向下兼容性。

如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥(也就是只使用两个DES密钥),这种三重DES就称为DES-EDE2。EDE表示的是加密(Encryption) -->解密(Decryption)-->加密(Encryption)这个流程。

密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES称为DES-EDE3。

尽管三重DES目前还被银行等机构使用,但其处理速度不高,而且在安全性方面也逐渐显现出了一些问题

2. Go实现对称加密

2.1 DES 实现:
  • CBC 分组模式:

加密:

  1. 创建并返回一个使用DES算法的cipher.Block接口 秘钥长度为64bit, 即 64/8 = 8字节(byte)
  2. 对最后一个明文分组进行数据填充
    DES是以64比特的明文(比特序列)为一个单位来进行加密的
    最后一组不够64bit, 则需要进行数据填充( 参考第三章)
  3. 创建一个密码分组为链接模式的, 底层使用DES加密的BlockMode接口
  4. 加密连续的数据块

解密

  1. 创建并返回一个使用DES算法的cipher.Block接口
  2. 创建一个密码分组为链接模式的, 底层使用DES解密的BlockMode接口
  3. 数据块解密
  4. 去掉最后一组的填充数据

代码实现
1.明文/密文分组填充与移除

// 分组填充--填充对应长度的相同数字(1, 22, 333....)
//data: 待分组数据, blockSize: 每组的长度
func PKCS7Padding(date []byte, blockSize int)(PaddingResult[]byte){
    // 获取数据长度
    length:=len(date)
    // 获取待填充数据长度
    count:=length%blockSize
    PaddingCount:=blockSize-count
    // 在数据后填充数据
    PaddingDate:=bytes.Repeat([]byte{byte(PaddingCount)},PaddingCount)
    PaddingResult=append(date,PaddingDate...)
    return
}

//  分组移除
 func PKCS7Unpadding(date []byte, blockSize int)(UnpaddingResult[]byte){
    length:=len(date)
    temp:=int(date[length-1])
    UnpaddingResult=date[:length-temp]
    return
 }
  1. DES加密与解密:
//src:           --明文/密文,需要分组填充,每组8byte
//key:           --秘钥   8byte
//iv:            --初始化向量  8byte  长度必须与key相同
--------------------------------------------------------------
//加密
func Des_CBC_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    // 判断是否创建成功
    if err != nil {
        panic(err)
    }
    // 明文组数据填充
    paddingText := PKCS7Padding_Unpadding.PKCS7Padding(src, block.BlockSize())
    // 创建一个密码分组为链接模式的, 底层使用DES加密的BlockMode接口
    blockMode := cipher.NewCBCEncrypter(block, iv)
    // 加密
    dst := make([]byte, len(paddingText))
    blockMode.CryptBlocks(dst, paddingText)
    return dst
}

---------------------------------------------------------

// 解密:
func Des_CBC_Decrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    if err != nil {
        panic(err)
    }
    // 创建一个密码分组为链接模式的, 底层使用DES解密的BlockMode接口
    blockMode := cipher.NewCBCDecrypter(block, iv)
    // 解密
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)
    // 分组移除
    dst = PKCS7Padding_Unpadding.PKCS7Unpadding(dst, block.BlockSize())
    return dst
}
  • CTR 分组模式:

加密:

  1. 创建并返回一个使用DES算法的cipher.Block接口 秘钥长度为64bit, 即 64/8 = 8字节(byte)
  2. 创建一个CTR密码分组为链接模式的, 底层使用DES加密的BlockMode接口
  3. 加密连续的数据块

解密

与加密算法完全一致

代码实现

/*
DES CTR 加密解密函数
参数:
    src:           --明文/密文 分组不需要填充
    key:           --秘钥   8byte
    iv:            --初始化向量  8byte  长度必须与key相同
 */
//加密
func Des_CTR_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用DES算法的cipher.Block接口
    block, err := des.NewCipher(key)
    // 判断是否创建成功
    if err != nil {
        panic(err)
    }

    // 创建一个密码分组为链接模式的, 底层使用DES加密的stream接口
    stream := cipher.NewCTR(block,iv)
    // 加密
    dst := make([]byte, len(src))
    stream.XORKeyStream(dst,src)
    return dst
}
// 解密 直接调用加密函数
func Des_CTR_Decrypt(src []byte, key []byte, iv []byte) []byte {
    return Des_CTR_Encrypt(src,key,iv)
}
2.2 3DES 实现:

与DES 基本一致, 唯一不同点:
key 长度:3*8=24byte

代码实现

/*
3DES CBC 加密解密函数
Des3_CBC_Encrypt()  --加密
Des3_CBC_Decrypt()  --解密
参数:
    src:           --明文/密文,需要分组填充,每组8byte
    key:           --秘钥   3*8=24byte
    iv:            --初始化向量  8byte
 */

func Des3_CBC_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    // 判断是否创建成功
    if err != nil {
        panic(err)
    }
    // 明文组数据填充
    paddingText := PKCS7Padding_Unpadding.PKCS7Padding(src, block.BlockSize())
    // 创建一个密码分组为链接模式的, 底层使用DES加密的BlockMode接口
    blockMode := cipher.NewCBCEncrypter(block, iv)
    // 加密
    dst := make([]byte, len(paddingText))
    blockMode.CryptBlocks(dst, paddingText)
    return dst
}

func Des3_CBC_Decrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    if err != nil {
        panic(err)
    }
    // 创建一个密码分组为链接模式的, 底层使用3DES解密的BlockMode接口
    blockMode := cipher.NewCBCDecrypter(block, iv)
    // 解密
    dst := make([]byte, len(src))
    blockMode.CryptBlocks(dst, src)
    // 分组移除
    dst = PKCS7Padding_Unpadding.PKCS7Unpadding(dst, block.BlockSize())
    return dst
}
--------------------------------------------------------------
/*
3DES CTR 加密解密函数
Des3_CTR_Encrypt()  --加密
Des3_CTR_Decrypt()  --解密
参数:
    src:           --明文/密文 分组不需要填充
    key:           --秘钥   3*8=24byte
    iv:            --初始化向量  8byte
 */

func Des3_CTR_Encrypt(src []byte, key []byte, iv []byte) []byte {
    // 创建并返回一个使用3DES算法的cipher.Block接口
    block, err := des.NewTripleDESCipher(key)
    // 判断是否创建成功
    if err != nil {
        panic(err)
    }

    // 创建一个密码分组为链接模式的, 底层使用DES加密的stream接口
    stream := cipher.NewCTR(block,iv)
    // 加密
    dst := make([]byte, len(src))
    stream.XORKeyStream(dst,src)
    return dst
}

func Des3_CTR_Decrypt(src []byte, key []byte, iv []byte) []byte {
    return Des3_CTR_Encrypt(src,key,iv)
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. 什么是DES DES(Data Encryption Standard)是1977年美国联邦信息处理标准(F...
    泡泡龙吐泡泡阅读 1,092评论 0 1
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 11,459评论 5 29
  • 加密的原因:保证数据安全 加密必备要素:1、明文/密文 2、秘钥 3、算法 秘钥:在密码学中是一个定长的字符串...
    Winnifred_阅读 13,025评论 0 3
  • 在介绍加密算法之前, 先介绍一下 base64: 0. base64 Base64要求把每三个8Bit的字节转换为...
    reboot_q阅读 12,667评论 3 8
  • 前期推广运营,公司定位 单店还是加盟推广 一,客户定位 二,客户资源数据来源, 1小海豚介绍。2网络。3医院。4学...
    ganweif阅读 79评论 0 0