您当前的位置:网站首页>yy6080,区块链中的密码学系列之对称加密算法的分组形式(六),虾仁炒蛋

yy6080,区块链中的密码学系列之对称加密算法的分组形式(六),虾仁炒蛋

2019-04-03 13:58:00 投稿作者:admin 围观人数:172 评论人数:0次

阅览本文大约需求12分钟。韩升延

1. 前语

众所周知,因为对称加密算法只能加密固定长度的明文。假如咱们想加密恣意长度的明文,则需求对明文进行分组,然花青素后对每组进行加密。

在暗码学中,被称为分组加密Block cipher)。将明文分红多个等长的模块,然后运用算法对每组进行加密。现代的分组加密的是创建在迭代的思维上的,这种思维来自

香农的《保密体系的通笹本梓信理论》。哈哈,便是咱们在本科学习到的那个大佬香农。值得留意的是,迭代发生的密文在每一轮中运用不同的子密钥,而这些子密钥由原密钥生成。

咱们熟知的DES和AES都是分组暗码完成的。

2. 分组暗码的体系模型



区块链中的暗码学系列之对称加密算法的分组方式(六)

分组暗码实质上是字长为m的数字序列的代换暗码。留意,在一般情况下,n和m是持平的。

3. 分组暗码的规划思维


扩yy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋散(diffusion):将明文冗余度涣散到密文中。进行分散最简略的方法是置换(Permutation),即重新排列字符。

混杂(confusion):让明文和密文之间的联系杂乱化,这样做是为了防止经过计算剖析从而破译暗码学。常用的方法是代换(Substitution)。

在实践中,代换常用代换表,用查表法来完成。常用的根本代换有以下几种:

1. 循环移位(Shift left/right circular)

2 .模2n加 (Addition wyy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋ith module)

3. 线性改换(Linear transformation)

4. 换位/置换(Transposition)

5. 仿射改换(Affine transform)

4. 分组暗码的规划要求


  1. 分组长度满足大(64~128~yy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋256比特)
  2. 密钥量要满足大(64~128~192~256比特)
  3. 算法满足杂乱(包含子密钥发生算法)
  4. 加密、解密算法简略,易软、硬件完成
  5. 便于剖析(破译是困难的,但算法却简练明晰)


其间,比较经典的完成是Feistel网络。Feistel网络运用乘积暗码完成要害暗码模块。

关于Feistel的具体解说参阅:区块链中的暗码学系列之对称加密算泡芙法DES(四)

5. 分组暗码运转方式


前面咱们知道,分组暗码在加密时明文分组的长度是固定的,而有用中待加密音讯的数据量是不定的,数据格局可能是多种多样的。所以咱们需求进行分组。为了更好的荫蔽明文的计算特性、数据的格局等,以进步全体的安全性, 下降删去、重放、刺进和假造成功的时机。咱们必需求选用恰当的分组运转方式。

常见的分组运转方式主要有四种:

电码本 (ECB, electronic codebook);

暗码分组链接 (矫情CBC, cipher block chaining);

暗码反应 (CFB, cipher feedback);

输出反应 (OFB, output feedback)。

下面咱们进行逐个学习。

5.1 ECB方式


ECB方式,全称Electronic Codebook方式,译为电子暗码本方式,即用相同的暗码分别对和傲娇妹妹同居的日子明文分组独立加密。

ECB方式适用于短数据(如加密密钥)的加密。如:安全传递DES密钥。其缺陷是相同的明文分组会加密为相同的密文分组,因而存在必定危险。


区块链中的暗码学系列之对称加密算法的分组方式(六)



值得留意的是,假如最终一个分组的长度不单亲公主相亲记够时,需求运用特别的数据进行填充。

5.2 CBC方式


CBC方式,全称Cipher Block Chaining方式,即密文分组链接方式,即加密算法的输入是上一个密文分组和下一个明文分组的异或。因为是将上一个密文分组和下一个明文分组的内容混合加密,因而能够防止ECB方式的缺陷。当加密第一个明文分组时,因为不存在上一个密文分组,因而需求预备与分组等长的初始化向量IV,来替代上一个密文分组。




值得留意的是,其缺陷是比特的过错传达,将影响下一组的解密。

在Fabric的AES算法的完成中,选用的便是CBC方式,源码地址:

https://github.com/hyperledger/fabric/blob/release-1.4/bccsp/sw/aes.go

f张乐泉unc aesCBCEncrypt(key, s []bytyy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋e) ([]b双歧杆菌yte, error) {
return aesCBCEncryptWithRand(rand.Reader, key, s)
}

func aesCBCEncryptWithRand(prng io.Reader, key, s []byte) ([]byte, error) {
if len(s)%aes.BlockSize != 0 {
return nil, errors.New("Invalid plaintext. It must be a multiple of the block size")
}

block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

ciphertext := make([]byte, aes.BlockSize+len(s))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(prng, iv); err != nil {
return nil, eyy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋rr
}

mode := cipher.NewCBCEncrypter(block, yy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], s)

return ciphertext, nil
}

func aesCBCEncryptWithIV(IV []byte, key, s []byte) ([]byte, error) {
if len(s)%aes.BlockSize != 0 缺钾{
return nil, errors.New("Invalid plaintext. It must be a multiple of the block size")
}

if len(IV) != aes.BlockSize {
return nil, errors.New("Invalid IV. It must have length the block size")
}

block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

ciphertext := make([]byte, aes.BlockSize+len(s))
copy(ciphertext[:aes.BlockSize], IV)

mode := cipher.NewCByy6080,区块链中的暗码学系列之对称加密算法的分组方式(六),虾仁炒蛋CEncrypter(block, IV)
mode.CryptBlocks(ciphertex倾城妖姬魅全国t[aes.BlockSize:], s)

return ciphertext, nil
}

func aesCBCDecrypt(key, src []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}

if len(src) < aes.BlockSize {
return nil, errors.New("Invalid ciphertext. It must be a multiple of the block size")
}
iv := src[:aes.BlockSize]
src = src[aes.BlockSize:]

if len(src)%ae一笑倾城s.BlockSize != 0 {
return nil, errors.New("Invalid ciphertext. It must be a multiple of the block size")
}

mode := cipher.NewCBCDecrypter(block, iv)

mode.CryptBlocks(src, src)

return src, nil
}

// AESCBCPKCS7Encrypt combines CBC encryption and PKCS7 padding
func AESCBCPKCS7Encrypt(key, src []byte) ([]byte, error) {
// First pad
tmp := pkcs7Padding(src)

// Then encrypt
return aesCBCEncrypt(key, tmp)
}

// AESCBCPKCS7Encrypt combines CBC encryption and PKCS7 padding using as prng the passed to the function
func AESCBCPKCS7EncryptWithRand(prng io.Reader, key, src []byte) ([]byte, error) {
// First pad
tmp := pkcs7P亚洲杯直播adding(src)

// Then e欣欣向荣ncrypt
return aesCBCEncryptWithRand(prng, key, tmp)
}

// AESCBCPKCS7Encrypt combines CBC encryption and PKCS7 padding, the IV used is the one passed to the functio真心话大冒险经典问题n
func AESCBCPKCS7EncryptWithIV(IV []byt范方启e, key, src []byte) ([]byte, error) {
// First pad
tmp := pkcs7Padding(src)

// Then encrypt
return aesCBCEncryptWithIV(IV, key, tmp)
}

// AESCBCPKCS7Decrypt combines CBC decryption and PKCS7 unpadding
func AESCBCPKCS7Decrypt(key, src []byte) ([]byte, error) {
// First decrypt
pt, err := aesCBCDecrypt(key, src)
if err == nil {
return pkcs7UnPadding(pt)
}
return nil, err
}

5.3 CFB方式


CFB方式,全称Cipher FeedBack方式,译为密文反应方式,即上一个密文分组作为加密算法的输入,输出与明文异或作为下一个分组的密文。在CFB方式中,明文分组和密文分组之间只要一次异或。




5.4 OFB方式


OFB方式,全称Output Feedback方式,译为输出反应程以南方式。OFB方式与CFB方式相似,仅仅加密算法的输入是上一次加密的输出。在OFB方式中,异或所需的密钥流,能够事前经过暗码算法生成,即生成密钥流的操作能够与异或运算并行。

OFB方式加密和处理解密逻辑相同,明成人视频网站文与密钥流异或生成密文,密文与密钥流异或生成明文。





5.5 分组暗码运转方式比较

6. 分组暗码的剖析


暗码剖析学中的假定:

人们总是假定进犯者能够截获在不安全信道上所传输的一切密文。

另一被广泛承受的假定是Kerchhoff假定:除密钥外,进犯者知道加密和解密的具体进程。

进犯分组暗码常用的方宝宝咳嗽怎样方法:

  • 强力进犯:密钥尽头查找进犯。
  • 差分暗码剖析:经过逐轮剖析明文对的差值对密文对差值的影响来康复密钥或密钥的某些比特。
  • 线性剖析:根本思维是经过寻觅一个给定暗码算法有用的线性近似表达式来剖析破译暗码体系。
the end
中美经贸高级别磋商在京举行,每周中美经贸大事件